解题2(IpIsSameSubNet)
题目描述
子网掩码是用来判断任意两台计算机的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地址
输出描述:
得到计算结果
输入
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)的更多相关文章
- SCNU ACM 2016新生赛决赛 解题报告
新生初赛题目.解题思路.参考代码一览 A. 拒绝虐狗 Problem Description CZJ 去排队打饭的时候看到前面有几对情侣秀恩爱,作为单身狗的 CZJ 表示很难受. 现在给出一个字符串代 ...
- SCNU ACM 2016新生赛初赛 解题报告
新生初赛题目.解题思路.参考代码一览 1001. 无聊的日常 Problem Description 两位小朋友小A和小B无聊时玩了个游戏,在限定时间内说出一排数字,那边说出的数大就赢,你的工作是帮他 ...
- HDU 3791二叉搜索树解题(解题报告)
1.题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=3791 2.参考解题 http://blog.csdn.net/u013447865/articl ...
- 【BZOJ1700】[Usaco2007 Jan]Problem Solving 解题 动态规划
[BZOJ1700][Usaco2007 Jan]Problem Solving 解题 Description 过去的日子里,农夫John的牛没有任何题目. 可是现在他们有题目,有很多的题目. 精确地 ...
- CH Round #56 - 国庆节欢乐赛解题报告
最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...
- wechall.net/stegano 解题心得
/* 转载请注明出处:http://www.cnblogs.com/Martinium/p/wechall_stegano.html */ 最近迷上了 www.wechall.net 网站,里面都是些 ...
- Mountains(CVTE面试题)解题报告
题目大意: 用一个数组代表群山的高度.高度大的地方代表山峰,小的地方代表山谷.山谷可以容水.假设有一天下了大雨,求群山中总共可以容纳多少水? 如图所示情况,a代表该数组,总共可以容纳5个水. 解题思路 ...
- timus 1180. Stone Game 解题报告
1.题目: 1180. Stone Game Time limit: 1.0 secondMemory limit: 64 MB Two Nikifors play a funny game. The ...
- timus 1175. Strange Sequence 解题报告
1.题目描述: 1175. Strange Sequence Time limit: 1.0 secondMemory limit: 2 MB You have been asked to disco ...
随机推荐
- ace admin
.svg image/svg+xml.woff application/x-font-woff.woff2 application/x- ...
- 【HQL】窗口函数
LAG LAG(col,n,DEFAULT) :与lead相反,用于统计窗口内往上第n行值.第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为NULL时候, ...
- python pyqt面板切换
- mysql中表里的数据重新设置自增的id的方法
如果删除表数据用这个 TRUNCATE TABLE tablename 如果不删除表 alter table table_name AUTO_INCREMENT=;
- linux 之 source命令:
source命令: source命令也称为“点命令”,也就是一个点符号(.).source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录. 用法: source filen ...
- Python基础6 面向对象编程
本节内容: 面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法. 引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战> ...
- 在Ubuntu 14.04 64bit上安装百度云Linux客户端BCloud
参考:https://www.cnblogs.com/kluan/p/6014989.html 下载 网盘安装包,Bcloud 是一个 Linux 下超赞的客户端, 官网 github: https: ...
- kubectl version报did you specify the right host or port
现象: [root@localhost shell]# kubectl version Client Version: version.Info{Major:", GitVersion:&q ...
- android的特点有哪些
android拥有完善的应用程序框架,支持4大应用组件activity,service,contentProvider,broadcast,可以在任意层次上进行复用和更换: android中java字 ...
- mingw编译ffmpeg 错误:Unknown option "--enable-memalign-hack"
据说mingw编译ffmpeg的话需要添加 --enable-memalign-hack 开关 但如果源码是最新版比如:ffmpeg4.0.2 的话 好像已经禁用了该开关. “我可以确认新的ffmpe ...