import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
/**
* 若IP地址或子网掩码格式非法则输出1,若IP1与IP2属于同一子网络输出0,若IP1与IP2不属于同一子网络输出2
*/
String mask = "";
String ip1 = "";
String ip2 = "";
mask = in.nextLine();
ip1 = in.nextLine();
ip2 = in.nextLine();
String[] maskArr = mask.split("\\.");
String[] ip1Arr = ip1.split("\\.");
String[] ip2Arr = ip2.split("\\.");
if (!isMaskOK(maskArr) || !isIpOK(ip1Arr) || !isIpOK(ip2Arr)) {
System.out.println("1");
return;
}
StringBuilder maskBinary = getBinaryBuilder(maskArr);
StringBuilder ip1Binary = getBinaryBuilder(ip1Arr);
StringBuilder ip2Binary = getBinaryBuilder(ip2Arr);
StringBuilder maskAndIp1 = new StringBuilder();
StringBuilder maskAndIp2 = new StringBuilder();
for (int i = 0; i < 32; i++) {
// 转成数字的0和1进行逻辑与
int result1 = maskBinary.charAt(i) - '0';
int result2 = ip1Binary.charAt(i) - '0';
// 逻辑与运算
maskAndIp1.append(result1 & result2);
}
for (int i = 0; i < 32; i++) {
int result1 = maskBinary.charAt(i) - '0';
int result2 = ip2Binary.charAt(i) - '0';
maskAndIp2.append(result1 & result2);
}
if (maskAndIp1.toString().equals(maskAndIp2.toString())) {
System.out.println("0");
} else {
System.out.println("2");
}
}
private static boolean isIpOK(String[] ipArr) {
if (jbCheckOK(ipArr)) {
return true;
}
return false;
}
private static boolean isMaskOK(String[] maskArr) {
// 检查4段、数字、范围
if (!jbCheckOK(maskArr)) {
return false;
}
StringBuilder binaryBuilder = getBinaryBuilder(maskArr);
// 检查每一段前面是1,后面是0
// 检查第一位
if (binaryBuilder.charAt(0) != '1') {
return false;
}
int zero = 1;
for (char c : binaryBuilder.toString().toCharArray()) {
if (c == '0') {
zero = 0;
// 证明该字符为1,如果zero == 0证明上次字符为0
} else if (zero == 0) {
return false;
}
}
return true;
}
private static StringBuilder getBinaryBuilder(String[] arr) {
StringBuilder binaryBuilder = new StringBuilder();
// 转成二进制
for (int i = 0; i < arr.length; i++) {
String binaryString = Integer.toBinaryString(Integer.parseInt(arr[i]));
// 0~255为8位二进制数
while (binaryString.length() < 8) {
binaryString += "0";
}
binaryBuilder.append(binaryString);
}
return binaryBuilder;
}
// 检查段数、数字、数字范围
private static boolean jbCheckOK(String[] arr) {
boolean ok = true;
if (arr.length != 4) {
ok = false;
}
for (int i = 0; i < arr.length; i++) {
for (int k = 0; k < arr[i].toCharArray().length; k++) {
// 如果不是数字
if (!Character.isDigit(arr[i].toCharArray()[k])) {
ok = false;
break;
}
}
if (!ok) {
break;
}
int num = Integer.parseInt(arr[i]);
if (num < 0 || num > 255) {
ok = false;
break;
}
}
return ok;
}
}