题解 | #判断两个IP是否属于同一子网#
判断两个IP是否属于同一子网
https://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { /** * 描述 * IP地址是由4个0-255之间的整数构成的,用"."符号相连。 * 二进制的IP地址格式有32位,例如:10000011,01101011,00000011,00011000;每八位用十进制表示就是131.107.3.24 * 子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。 * 子网掩码与IP地址结构相同,是32位二进制数,由1和0组成,且1和0分别连续,其中网络号部分全为“1”和主机号部分全为“0”。 * 你可以简单的认为子网掩码是一串连续的1和一串连续的0拼接而成的32位二进制数,左边部分都是1,右边部分都是0。 * 利用子网掩码可以判断两台主机是否在同一子网中。 * 若两台主机的IP地址分别与它们的子网掩码进行逻辑“与”运算(按位与/AND)后的结果相同,则说明这两台主机在同一子网中。 * 示例: * I P 地址 192.168.0.1 * 子网掩码 255.255.255.0 * 转化为二进制进行运算: * I P 地址 11000000.10101000.00000000.00000001 * 子网掩码 11111111.11111111.11111111.00000000 * AND运算 11000000.10101000.00000000.00000000 * 转化为十进制后为: * 192.168.0.0 * I P 地址 192.168.0.254 * 子网掩码 255.255.255.0 * 转化为二进制进行运算: * I P 地址 11000000.10101000.00000000.11111110 * 子网掩码 11111111.11111111.11111111.00000000 * AND运算 11000000.10101000.00000000.00000000 * 转化为十进制后为: * 192.168.0.0 * 通过以上对两台计算机IP地址与子网掩码的AND运算后,我们可以看到它运算结果是一样的。均为192.168.0.0,所以这二台计算机可视为是同一子网络。 * 输入一个子网掩码以及两个ip地址,判断这两个ip地址是否是一个子网络。 * 若IP地址或子网掩码格式非法则输出1,若IP1与IP2属于同一子网络输出0,若IP1与IP2不属于同一子网络输出2。 * 注: * 有效掩码与IP的性质为: * 1. 掩码与IP每一段在 0 - 255 之间 * 2. 掩码的二进制字符串前缀为网络号,都由‘1’组成;后缀为主机号,都由'0'组成 * <p> * 输入描述: * 3行输入,第1行是输入子网掩码、第2,3行是输入两个ip地址 * 题目的示例中给出了三组数据,但是在实际提交时,你的程序可以只处理一组数据(3行)。 * 输出描述: * 若IP地址或子网掩码格式非法则输出1,若IP1与IP2属于同一子网络输出0,若IP1与IP2不属于同一子网络输出2 * 255.255.255.0 * 192.168.224.256 * 192.168.10.4 * 1 * -- * 255.0.0.0 * 193.194.202.15 * 232.43.7.59 * 2 * -- * 255.255.255.0 * 192.168.0.254 * 192.168.0.1 * 0 * * @param args */ public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNext()) { String mask = in.nextLine(); String ip1 = in.nextLine(); String ip2 = in.nextLine(); int[] maskArray = str2IntArr(mask); int[] ipArray1 = str2IntArr(ip1); int[] ipArray2 = str2IntArr(ip2); if (null == maskArray || null == ipArray1 || null == ipArray2 || maskArray[0] < 255 ||maskArray[3] != 0) {//子掩码不能为0.0.0.0至少首位是255 System.out.println("1"); } else { StringBuilder sb1 = new StringBuilder(); StringBuilder sb2 = new StringBuilder(); for (int i = 0; i < 4; i++) { int c = maskArray[i]; int p1 = ipArray1[i]; int p2 = ipArray2[i]; ipArray1[i] = c & p1; ipArray2[i] = c & p2; sb1.append(ipArray1[i]).append(SPLIT); sb2.append(ipArray2[i]).append(SPLIT); } if (sb1.toString().equals(sb2.toString())) { System.out.println("0"); } else System.out.println("2"); } } } final static String SPLIT = "\\."; public static int[] str2IntArr(String str) { String replace = str.replaceAll(SPLIT, ""); for (int i = 0; i < replace.length(); i++) { if (!Character.isDigit(replace.charAt(i))) { return null; } } String[] arr = str.split(SPLIT); if (arr.length != 4) { return null; } int[] arrInt = new int[4]; for (int i = 0; i < arr.length; i++) { String s = arr[i]; if (s.length() > 3) { return null; } int num = Integer.parseInt(s); if (num > 255) { return null; } arrInt[i] = num; } return arrInt; } }