题目描述

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

    .svg             image/svg+xml.woff            application/x-font-woff.woff2          application/x- ...

  2. 【HQL】窗口函数

    LAG LAG(col,n,DEFAULT) :与lead相反,用于统计窗口内往上第n行值.第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为NULL时候, ...

  3. python pyqt面板切换

  4. mysql中表里的数据重新设置自增的id的方法

    如果删除表数据用这个 TRUNCATE TABLE tablename 如果不删除表 alter table table_name AUTO_INCREMENT=;

  5. linux 之 source命令:

    source命令: source命令也称为“点命令”,也就是一个点符号(.).source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录. 用法: source filen ...

  6. Python基础6 面向对象编程

    本节内容:   面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法.     引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战> ...

  7. 在Ubuntu 14.04 64bit上安装百度云Linux客户端BCloud

    参考:https://www.cnblogs.com/kluan/p/6014989.html 下载 网盘安装包,Bcloud 是一个 Linux 下超赞的客户端, 官网 github: https: ...

  8. kubectl version报did you specify the right host or port

    现象: [root@localhost shell]# kubectl version Client Version: version.Info{Major:", GitVersion:&q ...

  9. android的特点有哪些

    android拥有完善的应用程序框架,支持4大应用组件activity,service,contentProvider,broadcast,可以在任意层次上进行复用和更换: android中java字 ...

  10. mingw编译ffmpeg 错误:Unknown option "--enable-memalign-hack"

    据说mingw编译ffmpeg的话需要添加 --enable-memalign-hack 开关 但如果源码是最新版比如:ffmpeg4.0.2 的话 好像已经禁用了该开关. “我可以确认新的ffmpe ...