问题描述
原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成一个长整数。
举例:一个ip地址为10.0.3.193
每段数字 相对应的二进制数
10 00001010
0 00000000
3 00000011
193 11000001组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。
数据范围:保证输入的是合法的 IP 序列
输入描述:
输入
1 输入IP地址
2 输入10进制型的IP地址输出描述:
输出
1 输出转换成10进制的IP地址
2 输出转换后的IP地址
问题分析
- IP地址转十进制数
通过原理描述可知,IP地址转为十进制数,需要先通过字符串拆分将IP地址分为四段,再将其转为二进制数(确保每段都有8位),再将二进制数转为十进制数即可
- 十进制数转IP地址
由于IP地址由4个8位字段组成,每个字段的取值范围是0-255。每个字段都可以看作是256进制表示的一个数字。所以,
IP地址 = 第1个字段 * 256^3 + 第2个字段 * 256^2 + 第3个字段 * 256^1 + 第4个字段 * 256^0即
第1个字段乘以256的三次幂、第2个字段乘以256的二次幂、第3个字段乘以256的一次幂、第4个字段乘以256的零次幂。因为IP地址由4段构成,所以要遍历四次(i从3开始),可以将遍历的次数标识看成指数,通过以上公式,可先通过 (long) Math.pow(256, i);得出每个字段所对应的权重(例:第一个字段对应的权重是 :256^3);
再通过
待转换的长整型数 除以 用于转换的幂次数 能够获得每个8位部分的值接着通过
待转换的长整型数 取模 用于转换的幂次数获取每个8位部分中未转换的剩余部分
最后在每个字段后都添加上 . ,将其存储到字符串中,转化为IP地址
代码实现
将IP地址转换为二进制数
注意点:
①由于 . 需要进行转义才能识别,所以需要使用转义字符
②要将每一个整数都转为8位的二进制数
public static String toBinarySystem(String decimalism){
// 通过split()方法,将字符串通过 . 进行分割,将其分割为四个数
// 由于 . 需要进行转义才能识别,所以需要使用转义字符\\
String[] numbers = decimalism.split("\\.");
// 定义StringBuffer 来接收二进制数
StringBuffer buffer = new StringBuffer();
// 遍历分割出来的四个数
for (String number : numbers) {
// 将字符串转换为int类型
int num = Integer.parseInt(number);
// 通过toBinaryString()方法将int类型的数转换为二进制数,并通过format()将每一个整数都转为8位的二进制数,有空白的地方,使用0进行填充
String binary = String.format("%8s", Integer.toBinaryString(num)).replace(' ', '0');
// 将得到的4个8位二进制数 一 一 添加到buffer中
buffer.append(binary);
}
// 将StringBuffer转为String,并返回
return buffer.toString();
}
长整型数转换为IP地址
public static String toIPAddress(long ipLong) {
// 定义StringBuilder接收转换好的IP地址
StringBuilder ipAddress = new StringBuilder();
// 遍历4次
for (int i = 3; i >= 0; i--) {
// IP地址由4个8位字段组成,每个字段的取值范围是0-255。每个字段都可以看作是256进制表示的一个数字。
//为了将4个字段合并为一个整数表示IP地址,需要进行如下计算:IP地址 = 第1个字段 * 256^3 + 第2个字段 * 256^2 + 第3个字段 * 256^1 + 第4个字段 * 256^0
// 第1个字段乘以256的三次幂、第2个字段乘以256的二次幂、第3个字段乘以256的一次幂、第4个字段乘以256的零次幂。
//当使用Math.pow(256, i)计算时,i表示第i个字段的权重,即对应的指数(幂)。这里的i取值范围是0到3,对应IP地址中的4个字段。
//通过使用指数幂运算,我们可以将每个字段乘以对应的权重,最后将它们相加得到表示整个IP地址的长整数值。
long power = (long) Math.pow(256, i);
// 待转换的长整型数 除以 用于转换的幂次数 ,通过ipLong / power,能够获得每个8位部分的值
//在IP地址的表示中,每个点分十进制的部分都对应一个8位的二进制数。通过将长整型数 ipLong 除以 256 的幂次数(即 power),可以得到每个部分的值
long value = ipLong / power;
// ipLong %= power 用于获取每个8位部分中未转换的剩余部分,以便进行下一个循环迭代
ipLong %= power;
// 在前三个数(i的值为0,1,2时)中,每个数结束后添加 .
if (i < 3) {
ipAddress.append(".");
}else{
// 将获得到的整型数添加进StringBuilder中
ipAddress.append(value);
}
}
// 将StringBuilder转换为String类型返回
return ipAddress.toString();
}
运行测试
在这个地方实现将二进制数转为十进制数
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 输入IP地址
String decimalism = in.next();
// 输入IP地址十进制的长整型数
long binarynum = in.nextLong();
// 调用toBinarySystem(),将IP地址转为二进制数
String binary = toBinarySystem(decimalism);
// 通过parseLong(),将二进制数转为十进制数
Long target = Long.parseLong(binary, 2);
// 将十进制数输出
System.out.println(target);
// 调用toIPAddress(),将IP地址十进制的长整型数 转为 IP地址,并输出
System.out.println(toIPAddress(binarynum));
}
Over
若有更好的意见,请在评论区留言