题解 | #判断两个IP是否属于同一子网#
判断两个IP是否属于同一子网
https://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); String subnetMask = in.nextLine(); String ip1 = in.nextLine(); String ip2 = in.nextLine(); System.out.println(inSubnet(subnetMask, ip1, ip2)); } // 若IP地址或子网掩码格式非法则输出1,若IP1与IP2属于同一子网络输出0,若IP1与IP2不属于同一子网络输出2。 public static int inSubnet(String subnetMask, String ip1, String ip2) { if (!(validateSubnetMask(subnetMask) & validateIp(ip1) & validateIp(ip2))) { return 1; } // 把三个地址都转成二进制字符串 String subnetMaskBin = toBinaryString(subnetMask); String ip1Bin = toBinaryString(ip1); String ip2Bin = toBinaryString(ip2); StringBuilder sb1 = new StringBuilder(); StringBuilder sb2 = new StringBuilder(); for (int i = 0; i < 32; i++) { // charAt取到的0是48,1是49 int sub = (int) subnetMaskBin.charAt(i) - 48; int i1 = (int) ip1Bin.charAt(i) - 48; int i2 = (int) ip2Bin.charAt(i) - 48; int and1 = sub & i1; int and2 = sub & i2; sb1.append(and1); sb2.append(and2); } // 看看二进制每个位上取&得出来的结果是不是一样的 return sb1.toString().contentEquals(sb2) ? 0 : 2; } // 校验子网掩码,是返回true public static boolean validateSubnetMask(String subnetMask) { // 先转成二进制的字符串 String binaryString = toBinaryString(subnetMask); // 找到第一个0的位置 int location0 = binaryString.indexOf("0"); String substring = binaryString.substring(location0); // 如果第一个0后面没有1了那就表示都是左边是1右边是0,同时校验一下他是不是ip范围内的 return !substring.contains("1") & validateIp(subnetMask); } // 校验ip,是返回true public static boolean validateIp(String ip) { String[] split = ip.split("\\."); for (String i : split) { String binaryString = Integer.toBinaryString(Integer.parseInt(i)); // 是ip的判断条件就是4个数字都小于256,换算成二进制就是其长度要小于8,最大的255为11111111 if (binaryString.length() > 8) { return false; } } return true; } // 把ip或子网掩码转成二进制字符串 public static String toBinaryString(String ip) { StringBuilder stringBuilder = new StringBuilder(); String[] split = ip.split("\\."); for (String i : split) { String binaryString = Integer.toBinaryString(Integer.parseInt(i)); // 不足8位的用0补齐 StringBuilder complete0 = new StringBuilder(); for (int k = 0; k < 8 - binaryString.length(); k++) { complete0.append("0"); } stringBuilder.append(complete0).append(binaryString); } return stringBuilder.toString(); } }