题目描述
- 子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。
- 子网掩码与IP地址结构相同,是32位二进制数,其中网络号部分全为“1”和主机号部分全为“0”。利用子网掩码可以判断两台主机是否中同一子网中。若两台主机的IP地址分别与它们的子网掩码相“与”后的结果相同,则说明这两台主机在同一子网中。
示例:
IP地址 192.168.0.1
子网掩码 255.255.255.0
转化为二进制进行运算:
IP地址 11010000.10101000.00000000.00000001
子网掩码 11111111.11111111.11111111.00000000
AND运算 11000000.10101000.00000000.00000000
转化为十进制后为: 192.168.0.0
IP地址 192.168.0.254
子网掩码 255.255.255.0
转化为二进制进行运算:
IP地址 11010000.10101000.00000000.11111110
子网掩码 11111111.11111111.11111111.00000000
AND运算 11000000.10101000.00000000.00000000
转化为十进制后为: 192.168.0.0
通过以上对两台计算机IP地址与子网掩码的AND运算后,我们可以看到它运算结果是一样的。均为192.168.0.0,所以这二台计算机可视为是同一子网络。
输入描述
ip1 ip2 mask
192.168.1.1 192.168.1.2 255.255.255.0
输出描述
输出判断结果和第一个IP地址与子网掩码按位与操作后的结果。对于判断结果,1表示两个IP地址属于同一子网,0表示两个IP地址不属于同一子网。
1 192.168.1.0
代码实现
import java.util.Scanner;
public class test1 {
public static void main(String[] args){
//1.接收数据
Scanner scan = new Scanner(System.in);
String IP1 = scan.next();
String IP2 = scan.next();
String sub_IP = scan.next();
//2.转为2进制码
int[] arr1 = FormatChange(IP1);
int[] arr2 = FormatChange(IP2);
int[] arr3 = FormatChange(sub_IP);
//3.进行按位与操作
int[] ip1AndSub_IP = new int[32];
int[] ip2AndSub_IP = new int[32];
for(int i=0; i<32; i++){
ip1AndSub_IP[i] = MyAnd(arr1[i], arr3[i]);
ip2AndSub_IP[i] = MyAnd(arr2[i], arr3[i]);
}
//4.判断结果是否相同
int flag = 1;
for(int i=0; i<32; i++){
if(ip1AndSub_IP[i] != ip2AndSub_IP[i]){
flag = 0;
break;
}
}
//5.输出结果
System.out.print(flag + " ");
toIp(ip1AndSub_IP); //与操作后的结果
}
/**
* 获取IP的二进制码
* @param ip
* @return
*/
public static int[] FormatChange(String ip){
int[] result = new int[32];
for(int i=0; i<result.length; i++){
result[i] = 0;
}
String[] nums = ip.split("\\.");
int index = 0;
int[] byteFormat = new int[8];
for(int i=0; i<nums.length; i++){
//字符串--->数字
int temp = 0;
for(int j=0; j<nums[i].length(); j++){
temp = temp*10 + (nums[i].charAt(j) - '0');
}
//获取数字二进制码
byteFormat = getByteFormat(temp);
for(int k=0; k<byteFormat.length; k++){
result[index++] = byteFormat[k];
}
}
return result;
}
/**
* 返回一个数字的二进制码
* @param num
* @return
*/
public static int[] getByteFormat(int num){
int[] result = new int[8];
//初始化
for(int i=0; i<8; i++){
result[i] = 0;
}
//除2取余法
int temp = num;
int index = 7;
for(int i=0; i<8; i++){
int bit_num = temp%2;
result[index--] = bit_num;
temp = temp/2;
}
return result;
}
/**
* 假装按位与操作
* @param num1
* @param num2
* @return
*/
public static int MyAnd(int num1, int num2){
if(num1 == 1 && num1 == num2){
return 1;
}
return 0;
}
/**
* 再转为IP
* @param arr
*/
public static void toIp(int[] arr){
int temp = 0;
for(int i=0; i<32; i++){
temp = temp*2 + arr[i];
if(i==7 || i==15 || i==23){
System.out.print(temp + ".");
temp = 0;
}
if(i == 31){
System.out.print(temp);
}
}
}
}
总结
我能有什么办法啊,既不知道如何快速把字符串转为数字,又不知道是否有按位与函数,只能假装一下按位与喽,我个渣渣。