题目描述

子网掩码是用来判断任意两台计算机的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. (转)centos6.5 bind-DNS服务器bind的搭建详解

    centos6.5环境DNS-本地DNS服务器bind的搭建 域名系统(英文:Domain Name System,缩写:DNS)是因特网的一项服务.它作为将域名和IP地址相互映射的一个分布式数据库, ...

  2. Timer TimerTask schedule scheduleAtFixedRate

    jdk 自带的 timer 框架是有缺陷的, 其功能简单,而且有时候它的api 不好理解. import java.util.Date; import java.util.Timer; import ...

  3. MFC 如何在一个类中使用在其他类中定义的变量或函数

    [声明:本文的知识点来源于网络,参考网址:https://blog.csdn.net/bill_ming/article/details/7407848] [以下三种方法亲测有效,可以根据具体情况来选 ...

  4. Redis 五大数据类型及常用操作

    # 更详细的操作命令请查看 => http://redisdoc.com/ 1: KEY ( 键值 )  => 常见操作 2: String ( 字符串 ), 最大支持 512M 2.1: ...

  5. nodejs爬虫设置动态userAgent

    动态 userAgent 这是我收集到的常用的浏览器头部信息,每次爬取的时候从中随机选取一个,并使用 superAgent 设置请求头部的 User-Agent 字段就好了. userAgent.js ...

  6. VUE.js全局变量的定义

    模块化之后,想用js全局变量,遇到点困难.搜索资料后搞定,大概2个步骤: 1.定义一个vue模块,const定义变量,并用export对外暴露. Globle.vue <script> / ...

  7. Activity服务类-9 TaskService服务类

    一共72个接口 1.创建任务(2个方法)//创建与任何流程实例无关的新任务.Task newTask();//使用用户定义的任务id创建一个新任务.Task newTask(String taskId ...

  8. html to docx

    public static void main(String[] args) throws Exception{ //创建 POIFSFileSystem 对象 POIFSFileSystem poi ...

  9. vue:页面跳转和传参(页面之间,父传子,子传父)

    1.返回上一个页面: A.<a @click="$router.back(-1)" class="btn">重新加载</a> B.thi ...

  10. 10:处理 json

    json 通用的数据类型, 所有的语言都认识.json 是字符串.key-value 必须使用双引号1. loads() 和 dumps() 的使用 json.loads() 将 json 字符串转换 ...