zoukankan      html  css  js  c++  java
  • 判断两个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;
    }

    知识点 字符串
    运行时间限制 10M
    内存限制 128
    输入

    输入子网掩码、两个ip地址

    输出

    得到计算结果

    样例输入 255.255.255.0 192.168.224.256 192.168.10.4
    样例输出 1
    package com.oj;
    
    import java.util.Scanner;
    
    
    public class TestOj {
    	public static void main(String[] args) {
    		Scanner in = new Scanner(System.in);
    		//String input = in.nextLine();
    		String[] data = new String[3];
    		data[0] = in.nextLine();
    		data[1] = in.nextLine();
    		data[2] = in.nextLine();
    		if(data.length!=3){
    			System.out.println("1");
    			return ;
    		}
    		String[] masks = data[0].split("\.");
    		String[] ips = data[1].split("\.");
    		String[] ips2 = data[2].split("\.");
    		
    		if(masks.length!=4||ips.length!=4||ips2.length!=4){
    			System.out.println("1");
    			return ;
    		}
    		
    		int[] mask = new int[4];
    		int[] ip = new int[4];
    		int[] ip2 = new int[4];
    		for(int i = 0;i < 4; i++){
    			try{
    				mask[i] = Integer.parseInt(masks[i]);
    				ip[i] = Integer.parseInt(ips[i]);
    				ip2[i] = Integer.parseInt(ips2[i]);
    				if(mask[i]<0&&mask[i]>255){
    					System.out.println("1");
    					return;
    				}
    				
    				if(ip[i]<0&&ip[i]>255){
    					System.out.println("1");
    					return;
    				}
    				
    				if(ip2[i]>0&&ip2[i]>255){
    					System.out.println("1");
    					return;
    				}
    			}catch(Exception e){
    				System.out.println("1");
    				return;
    			}
    		}
    		
    		
    		
    		StringBuilder masksb = new StringBuilder();
    		StringBuilder ipsb = new StringBuilder();
    		StringBuilder ipsb2 = new StringBuilder();
    		for(int i = 0;i < 4; i++){
    			String temp = Integer.toBinaryString(mask[i]);
    			if(temp.length()!=8)
    				for(int j = 0;j < 8-temp.length(); j++)
    					masksb.append("0");
    			masksb.append(temp);
    			
    			String temp2 = Integer.toBinaryString(ip[i]);
    			if(temp2.length()!=8)
    				for(int j = 0;j < 8-temp2.length(); j++)
    					ipsb.append("0");
    			ipsb.append(temp2);
    			//System.out.println("ipsb: "+ipsb.toString());
    			
    			String temp3 = Integer.toBinaryString(ip2[i]);
    			if(temp3.length()!=8)
    				for(int j = 0;j < 8-temp3.length(); j++)
    					ipsb2.append("0");
    			ipsb2.append(temp3);
    		}
    		StringBuilder a = new StringBuilder();
    		for(int i = 0;i < masksb.toString().length(); i++)
    			if(masksb.charAt(i)=='1'&&ipsb.charAt(i)=='1')
    				a.append("1");
    			else
    				a.append("0");
    		
    		StringBuilder b = new StringBuilder();
    		for(int i = 0;i < masksb.toString().length(); i++)
    			if(masksb.charAt(i)=='1'&&ipsb2.charAt(i)=='1')
    				b.append("1");
    			else
    				b.append("0");
    		
    		if(a.toString().equals(b.toString()))
    			System.out.println("0");
    		else
    			System.out.println("2");
    	}
    }
    

      

  • 相关阅读:
    1001. 害死人不偿命的(3n+1)猜想 (15)
    单链表排序
    简单插入排序
    简单选择排序
    C语言-随机数
    二分查找(折半查找)
    顺序查找-顺序查找-带哨兵查找
    队列-链表实现
    循环队列_数组实现
    队列-顺序存储-简单实现
  • 原文地址:https://www.cnblogs.com/lxk2010012997/p/5344420.html
Copyright © 2011-2022 走看看