题解 | #整数与IP地址间的转换#
整数与IP地址间的转换
https://www.nowcoder.com/practice/66ca0e28f90c42a196afd78cc9c496ea
import java.util.*;
/**
* 原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成
* 一个长整数。
* 举例:一个ip地址为10.0.3.193
* 每段数字 相对应的二进制数
* 10 00001010
* 0 00000000
* 3 00000011
* 193 11000001
* 组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。
* 数据范围:保证输入的是合法的 IP 序列
*/
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
String strIp = in.nextLine();
String strNum = in.nextLine();
int step = 8;
String[] arr1 = strIp.split("\\.");
StringBuilder sbDes = new StringBuilder();
for (String s : arr1) {
String binStr = Integer.toBinaryString(Integer.parseInt(s));
StringBuilder sb = new StringBuilder(binStr);
for (int i = 0; i < step - binStr.length(); i++) {//补齐不够8位的0
sb.insert(0, '0');
}
sbDes.append(sb);
}
long d = Long.parseLong(sbDes.toString(), 2);
System.out.println(d);
//十进制转ip
long n = Long.parseLong(strNum);
String bs2 = Long.toBinaryString(n);
StringBuilder sb2 = new StringBuilder(bs2);
int j = sb2.length() % step;//除以8有余数时,要补齐0
if (j > 0) {
for (int i = 0; i < step-j; i++) {
sb2.insert(0, '0');
}
}
int size = (int) (sb2.length() / step + 0.5f);
String[] arr2 = new String[size];//00001010 00000000 00000011 11000001
int start = 0, end = step;
for (int i = 0; i < arr2.length; i++) {
arr2[i] = sb2.substring(start, end);
start = end;
end += step;
}
StringBuilder sb3 = new StringBuilder(arr2.length * 2 - 1);
for (String s : arr2) {
int i = Integer.parseInt(s, 2);
sb3.append(i).append('.');
}
String des2 = sb3.substring(0, sb3.length() - 1);
System.out.println(des2);
}
}
}

查看6道真题和解析