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

image
image
示例一

输入:
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;
	}
}


结果如下:
image

posted @ 2026-07-01 18:12  Carey_ccl  阅读(10)  评论(0)    收藏  举报