题目描述

子网掩码是用来判断任意两台计算机的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地址

输出描述:

得到计算结果

示例1

输入

255.255.255.0 192.168.224.256 192.168.10.4

输出

1

代码如下:

 package com.yzh.hehe;

 import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern; public class IpIsSameSubNet { public static void main(String[] args) {
Scanner scanner =new Scanner(System.in);
String mask,ip1,ip2;
mask=scanner.nextLine();
ip1=scanner.nextLine();
ip2=scanner.nextLine();
scanner.close();
System.out.println(checkNetSegment(mask, ip1, ip2));
} public static int checkNetSegment(String mask, String ip1, String ip2)
{
if (!isSubNetYanMa(mask)||!isIP(ip1)||!isIP(ip2)) {
return ;
}
String yu1=binaryYu(mask,ip1);
String yu2=binaryYu(mask,ip2);
if (!yu1.equals(yu2)) {
return ;
} return ; } private static boolean isIP(String addr) //判断是否是ip
{
if(addr.length() < || addr.length() > || "".equals(addr))
{
return false;
}
/**
* 判断IP格式和范围
*/
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}"; Pattern pat = Pattern.compile(rexp); Matcher mat = pat.matcher(addr); boolean ipAddress = mat.find(); return ipAddress;
} /*
* 判断是否是子网掩码,方法:先判断是否是ip,再对ip的二进制表示反转,再末位加1,得到的结果是2的n次方就是子网掩码
*/
private static boolean isSubNetYanMa(String code) {
if (!isIP(code)) {
return false;
}
String[] ips = code.split("\\.");
StringBuilder binaryVal = new StringBuilder();
for (int i = ; i < ips.length; i++) //转换成二进制
{
String binaryStr = Integer.toBinaryString(Integer.parseInt(ips[i])); Integer times = - binaryStr.length(); for(int j = ; j < times; j++)
{
binaryStr = "" + binaryStr;
}
binaryVal.append(binaryStr); //+= binaryStr;
} binaryVal.reverse();//反转
for (int i = ; i < binaryVal.length(); i++) {//末位加一
if (binaryVal.charAt(i)=='') { String temp =binaryVal.toString().replace('', '');
binaryVal=new StringBuilder(temp);
binaryVal.replace(i-,i , "");
break;
}
}
int codeNumber= Integer.parseInt(binaryVal.toString(), );//二进制转十进制
if(nCF(codeNumber)){
return true;
}else {
return false;
} } public static boolean nCF(int n){ //判断一个是否是2的n次方
boolean b = false;
while(true){
int j=n%;
n=n/;
if(j==){
b=false;
break;
}
if(n==){
b=true;
break;
}
}
return b;
} private static String binaryYu(String b1,String b2) {//两个ip地址相与
String[] bs1 = b1.split("\\.");
String[] bs2 = b2.split("\\.");
int[] iArr1=new int[];
int[] iArr2=new int[];
StringBuilder stringBuilder=new StringBuilder();
int temp=;
String tempstrString=null;
for (int i = ; i < iArr2.length; i++) {
iArr1[i]=Integer.valueOf(bs1[i]);
iArr2[i]=Integer.valueOf(bs2[i]);
temp=iArr1[i]&iArr2[i];
tempstrString=Integer.toBinaryString(temp);
for (int j = ; j < (-tempstrString.length()); j++) {
stringBuilder.append("");
}
stringBuilder.append(tempstrString);
} return stringBuilder.toString();
}
}

解题2(IpIsSameSubNet)的更多相关文章

  1. SCNU ACM 2016新生赛决赛 解题报告

    新生初赛题目.解题思路.参考代码一览 A. 拒绝虐狗 Problem Description CZJ 去排队打饭的时候看到前面有几对情侣秀恩爱,作为单身狗的 CZJ 表示很难受. 现在给出一个字符串代 ...

  2. SCNU ACM 2016新生赛初赛 解题报告

    新生初赛题目.解题思路.参考代码一览 1001. 无聊的日常 Problem Description 两位小朋友小A和小B无聊时玩了个游戏,在限定时间内说出一排数字,那边说出的数大就赢,你的工作是帮他 ...

  3. HDU 3791二叉搜索树解题(解题报告)

    1.题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=3791 2.参考解题 http://blog.csdn.net/u013447865/articl ...

  4. 【BZOJ1700】[Usaco2007 Jan]Problem Solving 解题 动态规划

    [BZOJ1700][Usaco2007 Jan]Problem Solving 解题 Description 过去的日子里,农夫John的牛没有任何题目. 可是现在他们有题目,有很多的题目. 精确地 ...

  5. CH Round #56 - 国庆节欢乐赛解题报告

    最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...

  6. wechall.net/stegano 解题心得

    /* 转载请注明出处:http://www.cnblogs.com/Martinium/p/wechall_stegano.html */ 最近迷上了 www.wechall.net 网站,里面都是些 ...

  7. Mountains(CVTE面试题)解题报告

    题目大意: 用一个数组代表群山的高度.高度大的地方代表山峰,小的地方代表山谷.山谷可以容水.假设有一天下了大雨,求群山中总共可以容纳多少水? 如图所示情况,a代表该数组,总共可以容纳5个水. 解题思路 ...

  8. timus 1180. Stone Game 解题报告

    1.题目: 1180. Stone Game Time limit: 1.0 secondMemory limit: 64 MB Two Nikifors play a funny game. The ...

  9. timus 1175. Strange Sequence 解题报告

    1.题目描述: 1175. Strange Sequence Time limit: 1.0 secondMemory limit: 2 MB You have been asked to disco ...

随机推荐

  1. 代码:jquery自定义插件 demo

    jquery自定义插件 demo 2016-1-13 只是一个简易的示例 <script type="text/javascript" src="http://cd ...

  2. curd——5

    curd——5 SELECT area_id  FROM 16tree.ts_area  where pid=0; <?php //1可以防止注入$db = Yii::app()->db; ...

  3. python中的pop

    pop()将列表指定位置的元素移除,同时可以将移除的元素赋值给某个变量,不填写位置参数则默认删除最后一位 pop()根据键将字典中指定的键值对删除,同时可以将删除的值赋值给变量 举个例子: 1 a = ...

  4. 使用mondorescue将本机linux centos 7服务器制作成光盘

    https://blog.csdn.net/wuxianfeng1987/article/details/78059618   没试 重新封装linux系统成iso文件 https://zhidao. ...

  5. springMVC数据模型model,modelmap,map,@ModelAttribute的相互关系

    结论: a.注解方法中形参为model,modelmap,map一个或几个时,他们指向的引用对象相同即他们的值相同. b.当使用@ModelAttribute注解请求参数时,springmvc自动将该 ...

  6. php7内核执行流程(转载留记录)

  7. linux MYSQL大小写问题处理

    1)window下默认大小写不敏感,所以在window下.创建表 test后再想创建表TEST会报错.而linux下默认可以.认为是不同的两张表 2)linux创建数据库,安装完毕后 首要任务是在li ...

  8. YUV420格式解析<转>

    在YUV420中,一个像素点对应一个Y,一个2X2的小方块对应一个U和V.对于所有YUV420图像,它们的Y值排列是完全相同的,因为只有Y的图像就是灰度图像. YUV420sp与YUV420p的数据格 ...

  9. Runloop原理

    简单的说,runloop是一个事件循环的机制,同时能够保活线程.iOS中每个线程都对应一个runloop,主线程的runloop默认开启,其他线程的runloop默认关闭,线程与runloop是一一对 ...

  10. mysql5.7.21免安装版配置步骤

    1. 下载mysql5.7.21 地址https://dev.mysql.com/downloads/mysql/ 2. 解压缩 任何文件夹都行,为了避免放在系统盘,我放到了E盘,目录为E:\Prog ...