华为-判断两个IP是否属于同一子网
(java实现)
问题
题目描述:
子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。
子网掩码与IP地址结构相同,是32位二进制数,其中网络号部分全为“1”和主机号部分全为“0”。利用子网掩码可以判断两台主机是否中同一子网中。若两台主机的IP地址分别与它们的子网掩码相“与”后的结果相同,则说明这两台主机在同一子网中。
示例:
I P 地址 192.168.0.1
子网掩码 255.255.255.0
转化为二进制进行运算:
I P 地址 11010000.10101000.00000000.00000001
子网掩码 11111111.11111111.11111111.00000000
AND运算
11000000.10101000.00000000.00000000
转化为十进制后为:
192.168.0.0
I P 地址 192.168.0.254
子网掩码 255.255.255.0
转化为二进制进行运算:
I P 地址 11010000.10101000.00000000.11111110
子网掩码 11111111.11111111.11111111.00000000
AND运算
11000000.10101000.00000000.00000000
转化为十进制后为:
192.168.0.0
通过以上对两台计算机IP地址与子网掩码的AND运算后,我们可以看到它运算结果是一样的。均为192.168.0.0,所以这二台计算机可视为是同一子网络。
输入一个子网掩码以及两个ip地址,判断这两个ip地址是否是一个子网络。
若IP地址或子网掩码格式非法则输出1,若IP1与IP2属于同一子网络输出0,若IP1与IP2不属于同一子网络输出2。
输入描述:
输入子网掩码、两个ip地址
输出描述:
得到计算结果
示例1:
输入
255.255.255.0
192.168.224.256
192.168.10.4
255.0.0.0
193.194.202.15
232.43.7.59
输出
1
2
问题分析:
1、先判断子网掩码是否合法;
2、再判断输入的IP是否合法;
3、在子网掩码的位数下,比较两个IP二进制是否相同;
注意:在将整数转为二进制字符串时,要考虑补齐够8位数
相关知识:
1、将整数转为二进制字符串:int tmp = Integer.toBinaryString(re); //转为二进制
2、将IP内的数分离出来,“.”为特殊字符,需要用双反斜杠“\”: String[] str = s.split("\."); //传入IP地址,并将其拆分为多个数;
其次使用函数,将字符串转为整数: int re = Integer.parseInt(str[i]);
3、java十进制转换成二进制数
牢记常用的!
1.十进制转成二进制
String s = Integer.toBinaryString(n) //将十进制数转成字符串,例如n=5 ,s = “101”
2.将字符串转成整形
int a = Integer.valueof(“1002”); //当然s只能是数字类的字符串
或者
int a = Integer.parseInt(“1002”);
3.将整形转成字符串
String s = String.valueof(1025); 直接转成了
4.将整形转成十六进制的数
String s = Integer.toHexString(18); //输出结果12
算法实现:
略
参考代码:
import java.util.*;
public class Main {
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
while (input.hasNext())
{
String s0 = input.nextLine();
String s01 = input.nextLine();
String s02 = input.nextLine();
String res = intToStr(s0);
String res1 = intToStr(s01);
String res2 = intToStr(s02);
if (res.equals("false") || res1.equals("false") || res2.equals("false"))
{
System.out.println("1"); //非法
continue;
}
//统计子网掩码 1 的个数
char[] ch = res.toCharArray();
int count = 0;
for (int i=0; i<ch.length; i++)
{
if (ch[i]=='1')
{
count++;
}
else{
break;
}
}
boolean flag = true;
for (int i=count; i<ch.length; i++)
{
if (ch[i]=='1')
{
flag = false;
break;
}
}
if (!flag)
{
System.out.println("1"); //检测子网掩码非法,得是:网络号部分全为“1”和主机号部分全为“0”
continue;
}
char[] ch1 = res1.toCharArray();
char[] ch2 = res2.toCharArray();
int ni = 0;
for(; ni<count; ni++)
{
if (ch1[ni]!=ch2[ni]) //比较两个子网掩码
{
break;
}
}
if (count == ni)
{
System.out.println("0");
}else
{
System.out.println("2");
}
}
}
public static String intToStr(String s)
{
String[] str = s.split("\\."); //传入IP地址,并将其拆分
String res = "",tmp,t;
for (int i=0; i<str.length; i++)
{
int re = Integer.parseInt(str[i]);
if (re>=0 && re<=255)
{
tmp = Integer.toBinaryString(re); //转为二进制
//补齐8位数
t = "";
for (int j=0; j<8-tmp.length(); j++)
{
t += "0";
}
res = res + t + tmp;
}
else
return "false"; //非法
}
return res;
}
}