华为OJ075-判断两个IP是否属于同一子网
Posted Wang-Junchao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为OJ075-判断两个IP是否属于同一子网相关的知识,希望对你有一定的参考价值。
【华为OJ】【算法总篇章】
【华为OJ】【075-判断两个IP是否属于同一子网】
【工程下载】
题目描述
子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。
子网掩码与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,
所以这二台计算机可视为是同一子网络。
/**
* 功能: 判断两台计算机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;
/**
* Author: 王俊超
* Date: 2016-01-03 12:59
* Declaration: All Rights Reserved !!!
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt"));
while (scanner.hasNext()) {
String subnet = scanner.next();
String ip1 = scanner.next();
String ip2 = scanner.next();
System.out.println(subnetJudgement(subnet, ip1, ip2));
}
scanner.close();
}
private static int subnetJudgement(String subnet, String ip1, String ip2) {
// 1:IP地址或子网掩码格式非法
if (!ipValidate(subnet) || !ipValidate(ip1) || !ipValidate(ip2)) {
return 1;
}
int subnetInt = ipStrToInt(subnet);
// 1:子网掩码格式非法
if (!subnetMaskValidate(subnetInt)) {
return 1;
}
int b = ipStrToInt(ip2);
int a = ipStrToInt(ip1);
// 0:IP1与IP2属于同一子网络
if ((a & subnetInt) == (b & subnetInt)) {
return 0;
}
// 2:IP1与IP2不属于同一子网络
else {
return 2;
}
}
/**
* 验证IP地址的格式是否正确
*
* @param ip IP地址
* @return true:格式正确,false:格式不正确
*/
private static boolean ipValidate(String ip) {
String[] part = ip.split("\\\\.");
// if (part.length != 4) {
// return false;
// }
for (String s : part) {
try {
int num = Integer.parseInt(s);
if (num < 0 || num > 255) {
return false;
}
} catch (Exception ex) {
return false;
}
}
return true;
}
/**
* 子网掩码验证,网络号部分全为“1”和主机号部分全为“0”
*
* @param ip
* @return
*/
private static boolean subnetMaskValidate(int ip) {
boolean hasZero = false;
int and = 0x80000000;
while (and != 0) {
// 所处理的位位置为0
if ((ip & and) == 0) {
// 说明出现了0
hasZero = true;
}
// 如果位置为1
else {
// 之前已经有0出现过,那说明1是不连续的,所以子网掩码不合法
if (hasZero) {
return false;
}
}
// 无符号右移一位
and >>>= 1;
}
return true;
}
/**
* 将点分十进制的IP地址转换成整数表示
*
* @param ip 点分十进制的IP地址
* @return IP地址的整数表
*/
private static int ipStrToInt(String ip) {
String[] part = ip.split("\\\\.");
int intIP = 0;
for (int i = 0; i < part.length; i++) {
int t = Integer.parseInt(part[i]);
intIP += t << (24 - 8 * i);
}
return intIP;
}
}
以上是关于华为OJ075-判断两个IP是否属于同一子网的主要内容,如果未能解决你的问题,请参考以下文章