还是需要点业务处理的,不过总体来说可以靠着字符串处理来完成。
首先可以对ip和mark的基本合法性进行校验(主要是完成对ip的校验),
然后判断掩码的合法性,方法就是将不满足8位的二进制向前加够0,再对整个二进制掩码进行切割,由于掩码的左1右0的特性,切割出来的数组一定为1。在对全0全1进行特殊判断。完成掩码的合法性校验。
下一步就是对ip和掩码进行AND操作,使用为位运算符&轻松搞定。只要ip1和ip2对mark的&结果相同数量为4,就说明在同一网段下。因为任何数对 0 AND都是0。 题不难,就是业务处理。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
String maskCodeStr = s.nextLine();
String ipOneStr = s.nextLine();
String ipTwoStr = s.nextLine();
//转数组
String[] maskCodeArr = maskCodeStr.split("\\.");
String[] ipOneArr = ipOneStr.split("\\.");
String[] ipTwoArr = ipTwoStr.split("\\.");
// 校验ip和maskCode基本合法性
for (int i = 0; i < maskCodeArr.length; i++) {
if (!(Integer.parseInt(maskCodeArr[i]) >= 0 && Integer.parseInt(maskCodeArr[i]) <= 255)
|| !(Integer.parseInt(ipOneArr[i]) >= 0 && Integer.parseInt(ipOneArr[i]) <= 255)
|| !(Integer.parseInt(ipTwoArr[i]) >= 0 && Integer.parseInt(ipTwoArr[i]) <= 255)){
System.out.println(1);
return;
}
}
// 校验maskCode合法性
boolean isTrue = validateMaskCode(maskCodeArr);
if (!isTrue){
System.out.println(1);
return;
}
// 分析是否在同一子网
// System.out.println(maskCodeStr);
int count = 0;
for (int i = 0; i < maskCodeArr.length; i++) {
int ip1 = Integer.parseInt(Integer.toBinaryString(Integer.valueOf(ipOneArr[i])));
int ip2 = Integer.parseInt(Integer.toBinaryString(Integer.valueOf(ipTwoArr[i])));
int mask = Integer.parseInt(Integer.toBinaryString(Integer.valueOf(maskCodeArr[i])));
int a = ip1 & mask;
int b = ip2 & mask;
if (a == b){
count++;
//System.out.println(ip1+":"+ip2);
}
}
if (count == 4) {
System.out.println(0);
}else {
System.out.println(2);
}
}
private static boolean validateMaskCode(String[] maskCodeArr) {
//全为0和全为1都是错误的
int zero = 0;
int one = 0;
StringBuilder maskCode = new StringBuilder();
String zeros = "00000000";
for (String code : maskCodeArr) {
if ("0".equals(code)){
zero++;
}else if ("255".equals(code)){
one++;
}
String binaryString = Integer.toBinaryString(Integer.parseInt(code));
if (binaryString.length() < 8){
binaryString = zeros.substring(0,8-binaryString.length())+binaryString;
}
maskCode.append(binaryString);
}
if (zero == 4 || one == 4){
return false;
}
String[] split = maskCode.toString().split("[0]");
return split.length <= 1;
}
}