HJ39 判断两个IP是否属于同一子网


示例一
输入:
255.255.255.0
192.168.224.256
192.168.10.4
255.0.0.0
193.194.202.15
232.43.7.59
255.255.255.0
192.168.0.254
192.168.0.1
输出:
1
2
0
说明:
对于第一个例子:
255.255.255.0
192.168.224.256
192.168.10.4
其中IP:192.168.224.256不合法,输出1
对于第二个例子:
255.0.0.0
193.194.202.15
232.43.7.59
2个与运算之后,不在同一个子网,输出2
对于第三个例子,2个与运算之后,如题目描述所示,在同一个子网,输出0
答案如下:
package everydayPractice.bitOperation.HJ39;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.HashSet;
import java.util.Scanner;
/**
* Created by xxx on 2026/7/1
*/
public class AnswerMA {
public static void main(String[] args) throws UnknownHostException {
//全部有效的掩码
HashSet<String> allMask = new HashSet<String>();
allMask.add("255.255.255.255");
allMask.add("255.255.255.254");
allMask.add("255.255.255.252");
allMask.add("255.255.255.248");
allMask.add("255.255.255.240");
allMask.add("255.255.255.224");
allMask.add("255.255.255.192");
allMask.add("255.255.255.128");
allMask.add("255.255.255.0");
allMask.add("255.255.254.0");
allMask.add("255.255.252.0");
allMask.add("255.255.248.0");
allMask.add("255.255.240.0");
allMask.add("255.255.224.0");
allMask.add("255.255.192.0");
allMask.add("255.255.128.0");
allMask.add("255.255.0.0");
allMask.add("255.254.0.0");
allMask.add("255.252.0.0");
allMask.add("255.248.0.0");
allMask.add("255.240.0.0");
allMask.add("255.224.0.0");
allMask.add("255.192.0.0");
allMask.add("255.128.0.0");
allMask.add("255.0.0.0");
allMask.add("254.0.0.0");
allMask.add("252.0.0.0");
allMask.add("248.0.0.0");
allMask.add("240.0.0.0");
allMask.add("224.0.0.0");
allMask.add("192.0.0.0");
allMask.add("128.0.0.0");
allMask.add("0.0.0.0");
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String mask = sc.next();//掩码
String ipA = sc.next();//第1个IP
String ipB = sc.next();//第2个IP
//掩码的验证
if (!allMask.contains(mask)) {
System.out.println(1);//不满足输出1
continue;
}
//.分十进制第1个IP的验证,必须满足以下2个条件
String[] ipA_Arr = ipA.split("\\.");
//条件1:.分十进制的IP长度必须为4段
if (ipA_Arr.length < 4) {
System.out.println(1);//不满足输出1
continue;
}
//条件2:.每一段都在0~255之间
boolean err_flag = false;
for (String s : ipA_Arr) {
int num = Integer.parseInt(s);
if (num < 0 || num > 255) {
err_flag = true;
break;
}
}
if (err_flag) {
System.out.println(1);//不满足输出1
continue;
}
//.分十进制第2个IP的验证,同上,必须满足的2个条件相同
String[] ipB_Arr = ipB.split("\\.");
if (ipB_Arr.length < 4) {
System.out.println(1);//不满足输出1
continue;
}
err_flag = false;
for (String s : ipB_Arr) {
int num = Integer.parseInt(s);
if (num < 0 || num > 255) {
err_flag = true;
break;
}
}
if (err_flag) {
System.out.println(1);//不满足输出1
continue;
}
//掩码和IP全部转为Long型整数
long maskToLong = ipv4ToLong(mask);
long ipAToLong = ipv4ToLong(ipA);
long ipBToLong = ipv4ToLong(ipB);
if ((maskToLong & ipAToLong) != (maskToLong & ipBToLong)) {
//2个IP不在一个子网
System.out.println(2);
continue;
} else {
//2个IP在一个子网
System.out.println(0);
continue;
}
}
}
//ipv4转成long型数据
public static long ipv4ToLong(String ipAddress) throws UnknownHostException {
InetAddress inetAddress = InetAddress.getByName(ipAddress);
byte[] addressBytes = inetAddress.getAddress();
long result = 0;
for (byte octet : addressBytes) {
result <<= 8;
result |= octet & 0xff;
}
return result;
}
}
结果如下:


浙公网安备 33010602011771号