华为OJ-判断两个IP是否在同一子网

题目描述

子网掩码是用来判断任意两台计算机的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
import java.util.Scanner;

public class Ziwang {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Scanner sc = new Scanner(System.in);
		while(sc.hasNextLine()){
			String mask = sc.nextLine();
			String ip1 = sc.nextLine();
			String ip2 = sc.nextLine();

			int res = checkNetSegment(mask, ip1, ip2);
			System.out.println(res);
		}
	}

	public static int checkNetSegment(String mask, String ip1, String ip2) 
	{   

		String[] maskArr = mask.split("\\.");
		String[] ip1Arr = ip1.split("\\.");
		String[] ip2Arr = ip2.split("\\.");
        if(!checkNetSegment(maskArr) || !checkNetSegment(ip1Arr) || !checkNetSegment(ip2Arr)){
			return 1;
		}
        boolean flag = false;
		for(int i=0; i<4; i++){
			if((Integer.parseInt(maskArr[i]) & Integer.parseInt(ip1Arr[i])) 
               == (Integer.parseInt(maskArr[i]) & Integer.parseInt(ip2Arr[i]))){
                flag = true;
            }else{
                flag = false;
                break;
            }
		}
		if(flag) {
            return 0;
        }else{
            return 2;
        }
	}
	public static boolean checkNetSegment(String[] arr1){
		boolean f=false;
		for(int i=0;i<arr1.length;i++){
			if(0<=Integer.valueOf(arr1[i])&&Integer.valueOf(arr1[i])<=255){
				f=true;
			}else{
				f=false;
				break;
			}
		}
		return f;
	}
}

注意有几个问题:
1、这里判断输入是否合法,我们需要判断每部分是否在0~255之间,而不是判断是否由四部分组成
2、255.255.192.0 这种字符串用 . 号作为分隔符分割时,不能写split("."),因为在java API中,. 号代表匹配任意字符,而不是匹配. 号,所以应该写转义字符\\.
3、判断是否是同一子网的条件就是两个IP地址和子网掩码各位与之后,得到的两个字符串相同,则表示在同一子网中。
发布了120 篇原创文章 · 获赞 25 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/yearningseeker/article/details/52344974