import java.util.*;
public class PanDuanIpTongZiWang {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String yanMa = sc.next();
String ip1 = sc.next();
String ip2 = sc.next();
if (goodYanMa(yanMa) && goodIp(ip1) && goodIp(ip2)) {
if ((change(yanMa) & change(ip1)) == (change(yanMa) & change(ip2)))
System.out.println("Ip1与Ip2同属一个子网");
else
System.out.println("Ip1与Ip2不属一个子网");
} else
System.out.println("不合法的Ip或子网掩码");
}
}
public static long change(String s) { //将十进制分组的Ip,转为十进制不分组的Ip,以方便后续和子网掩码进行&运算
String[] split = s.split("\\.");
StringBuilder builder = new StringBuilder();
for (String s1 : split) {
String s2 = Long.toString(Long.parseLong(s1), 2);
while (s2.length() != 8) {
s2 = new StringBuilder(s2).insert(0, 0).toString();
}
builder.append(s2);
}
return Long.valueOf(builder.toString(), 2);
}
public static boolean goodIp(String s) { //判断Ip是否合法
String[] split = s.split("\\.");
if (split.length!=4)
return false;
for (String s1 : split) {
if (Integer.parseInt(s1) < 0 || Integer.parseInt(s1) > 255) {
return false;
}
}
return true;
}
public static boolean goodYanMa(String s) { //判断子网掩码是否合法
String[] split = s.split("\\.");
if (split.length != 4)
return false;
StringBuilder builder = new StringBuilder();
for (String s1 : split) {
if (Integer.parseInt(s1) >= 0 && Integer.parseInt(s1) <= 255) { //若不在0-255之间,则返回false
String s2 = Long.toString(Long.parseLong(s1), 2); //每组转为二进制
while (s2.length() != 8) { //若转为二进制之后,长度不够8位,需要在前面补全0
s2 = new StringBuilder(s2).insert(0, 0).toString();
}
builder.append(s2);
} else {
return false;
}
}
String toString = builder.toString();
if (toString.equals("11111111111111111111111111111111") || toString.equals("00000000000000000000000000000000")) { //全1或者全0的子网掩码也是不合法的
return false;
}
for (int i = 0; i < toString.length() - 1; i++) {
String substring = toString.substring(i, i + 2);
if (substring.equals("01")) {//如何判断子网掩码是否合法,在最后拼接好的32位二进制字符串中查找,是否包含“01”,若包含则不合法
return false;
}
}
return true;
}
}
判断两个Ip地址是否同属一个子网-Java
最新推荐文章于 2023-04-06 14:30:00 发布