题解 | #判断两个IP是否属于同一子网#
判断两个IP是否属于同一子网
https://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) { BufferedReader r = new BufferedReader(new InputStreamReader(System.in)); StringBuilder ans = new StringBuilder(); String co, ip1, ip2; int[] inAr1 = new int[] {-1, -1, -1, -1}, inAr2 = new int[] {-1, -1, -1, -1}, inAr3 = new int[] {-1, -1, -1, -1}; int i = 0, cover, ipIn1, ipIn2; boolean isNoLegal; int[] legCor = new int[31]; do {//获得所有合法的掩码 legCor[i] = -1 << i + 1; i++; } while (i < 31); try { while ((co = r.readLine()) != null && !co.isEmpty()) { ip1 = r.readLine(); ip2 = r.readLine(); getAds(co, inAr1); getAds(ip1, inAr2); getAds(ip2, inAr3); i = 0; isNoLegal = false; do { if ((inAr1[i] | 255 - inAr1[i]) < 0 || (inAr2[i] | 255 - inAr2[i]) < 0 || (inAr3[i] | 255 - inAr3[i]) < 0) { isNoLegal = true; break; } i++; } while (i < 4); if (isNoLegal) {//地址非法输出1 ans.append(1).append("\n"); continue; } i = 0; cover = 0;//初值为0 ipIn1 = 0;//初值为0 ipIn2 = 0;//初值为0 do { cover = cover | inAr1[i] << (3 - i) * 8;//掩码合并 ipIn1 = ipIn1 | inAr2[i] << (3 - i) * 8;//第一行ip合并 ipIn2 = ipIn2 | inAr3[i] << (3 - i) * 8;//第二行ip合并 i++; } while (i < 4); i = 0; isNoLegal = true;//默认不在 do {//看输入的掩码是否在合理掩码数组内 if (legCor[i] == cover) { isNoLegal = false; break; } i++; } while (i < 31); if (isNoLegal) {//子网掩码地址非法输出1 ans.append(1).append("\n"); continue; } if ((cover & ipIn1) == (cover & ipIn2)) ans.append(0).append("\n"); else ans.append(2).append("\n"); } } catch (IOException e) { throw new RuntimeException(e); } System.out.print(ans); } public static void getAds(String str, int[] arr) { char[] chs = str.toCharArray(); int z = 0, x = 0, c = 0, n = 0, l = chs.length; do { if (chs[z] == '.') { if (x == 0) c++;//空位不变为-1 else arr[c++] = n;//非空将值赋给数组返回 n = 0; x = 0; z++; continue; } x++; n *= 10; n += chs[z] - '0'; if (c == 3) arr[3] = n; z++; } while (z < l); } }