题目描述
子网掩码是用来判断任意两台计算机的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地址是同一子网络。
* 输入参数: String Mask: 子网掩码,格式:“255.255.255.0”;
* String ip1: 计算机1的IP地址,格式:“192.168.0.254”;
* String ip2: 计算机2的IP地址,格式:“192.168.0.1”;
*
* 返回值: 0:IP1与IP2属于同一子网络; 1:IP地址或子网掩码格式非法; 2:IP1与IP2不属于同一子网络
*/
public int checkNetSegment(String mask, String ip1, String ip2)
{
/*在这里实现功能*/
return 0;
}
输入描述:
输入子网掩码、两个ip地址
输出描述:
得到计算结果
输入
255.255.255.0 192.168.224.256 192.168.10.4
输出
1
代码如下:
1 package com.yzh.hehe; 2 3 import java.util.Scanner; 4 import java.util.regex.Matcher; 5 import java.util.regex.Pattern; 6 7 public class IpIsSameSubNet { 8 9 public static void main(String[] args) { 10 Scanner scanner =new Scanner(System.in); 11 String mask,ip1,ip2; 12 mask=scanner.nextLine(); 13 ip1=scanner.nextLine(); 14 ip2=scanner.nextLine(); 15 scanner.close(); 16 System.out.println(checkNetSegment(mask, ip1, ip2)); 17 } 18 19 public static int checkNetSegment(String mask, String ip1, String ip2) 20 { 21 if (!isSubNetYanMa(mask)||!isIP(ip1)||!isIP(ip2)) { 22 return 1; 23 } 24 String yu1=binaryYu(mask,ip1); 25 String yu2=binaryYu(mask,ip2); 26 if (!yu1.equals(yu2)) { 27 return 2; 28 } 29 30 return 0; 31 32 } 33 34 private static boolean isIP(String addr) //判断是否是ip 35 { 36 if(addr.length() < 7 || addr.length() > 15 || "".equals(addr)) 37 { 38 return false; 39 } 40 /** 41 * 判断IP格式和范围 42 */ 43 String rexp = "([1-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3}"; 44 45 Pattern pat = Pattern.compile(rexp); 46 47 Matcher mat = pat.matcher(addr); 48 49 boolean ipAddress = mat.find(); 50 51 return ipAddress; 52 } 53 54 /* 55 * 判断是否是子网掩码,方法:先判断是否是ip,再对ip的二进制表示反转,再末位加1,得到的结果是2的n次方就是子网掩码 56 */ 57 private static boolean isSubNetYanMa(String code) { 58 if (!isIP(code)) { 59 return false; 60 } 61 String[] ips = code.split("\\."); 62 StringBuilder binaryVal = new StringBuilder(); 63 for (int i = 0; i < ips.length; i++) //转换成二进制 64 { 65 String binaryStr = Integer.toBinaryString(Integer.parseInt(ips[i])); 66 67 68 Integer times = 8 - binaryStr.length(); 69 70 for(int j = 0; j < times; j++) 71 { 72 binaryStr = "0" + binaryStr; 73 } 74 binaryVal.append(binaryStr); //+= binaryStr; 75 } 76 77 binaryVal.reverse();//反转 78 for (int i = 0; i < binaryVal.length(); i++) {//末位加一 79 if (binaryVal.charAt(i)=='1') { 80 81 String temp =binaryVal.toString().replace('1', '0'); 82 binaryVal=new StringBuilder(temp); 83 binaryVal.replace(i-1,i , "1"); 84 break; 85 } 86 } 87 int codeNumber= Integer.parseInt(binaryVal.toString(), 2);//二进制转十进制 88 if(nCF(codeNumber)){ 89 return true; 90 }else { 91 return false; 92 } 93 94 } 95 96 public static boolean nCF(int n){ //判断一个是否是2的n次方 97 boolean b = false; 98 while(true){ 99 int j=n%2; 100 n=n/2; 101 if(j==1){ 102 b=false; 103 break; 104 } 105 if(n==2){ 106 b=true; 107 break; 108 } 109 } 110 return b; 111 } 112 113 private static String binaryYu(String b1,String b2) {//两个ip地址相与 114 String[] bs1 = b1.split("\\."); 115 String[] bs2 = b2.split("\\."); 116 int[] iArr1=new int[4]; 117 int[] iArr2=new int[4]; 118 StringBuilder stringBuilder=new StringBuilder(); 119 int temp=0; 120 String tempstrString=null; 121 for (int i = 0; i < iArr2.length; i++) { 122 iArr1[i]=Integer.valueOf(bs1[i]); 123 iArr2[i]=Integer.valueOf(bs2[i]); 124 temp=iArr1[i]&iArr2[i]; 125 tempstrString=Integer.toBinaryString(temp); 126 for (int j = 0; j < (8-tempstrString.length()); j++) { 127 stringBuilder.append("0"); 128 } 129 stringBuilder.append(tempstrString); 130 } 131 132 return stringBuilder.toString(); 133 } 134 }
浙公网安备 33010602011771号