1.4 判断两个IP是否属于同一子网

判断两个IP是否属于同一子网

题目描述

  1. 子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。
  2. 子网掩码与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);
			}
		}
	}
}

总结

      我能有什么办法啊,既不知道如何快速把字符串转为数字,又不知道是否有按位与函数,只能假装一下按位与喽,我个渣渣。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值