题解 | 整数与IP地址间的转换
解题思路:
- 整体思路比较简单: 二进制转化十进制,十进制再转二进制
注意点:
- 在分割 IP 时,
split需使用\\.,否则分割结果不正确。 - 十进制转二进制时,因待转换数字长度可能超过
int最大值,需使用long - 二进制转十进制时,转换结果也可能超过
int最大值,同样使用long - 十进制转二进制时,从右至左得出
1或0,存储于数组时,从最后一位开始存放。
进制转化思路:
- 二进制转化:对
2取余,再除以2继续取余,将所得余数从右往左组装。 - 十进制转化:从右往左,逐位乘以
2(每前进一位,乘2),最终求和。
import java.util.Arrays;
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String[] numArr = in.next().split("\\.");
StringBuilder rsBin = new StringBuilder();
for (String s : numArr) {
int n = Integer.parseInt(s);
String binaryStr = convertToBinary(n, 8);
rsBin.append(binaryStr);
}
System.out.println(toDecimal(rsBin.toString()));
long ipNum = in.nextLong();
String binary = convertToBinary(ipNum, 32);
StringBuilder result = new StringBuilder();
for (int i = 0; i < binary.length(); i += 8) {
long r = toDecimal(binary.substring(i, i + 8));
result.append(r);
if (i + 8 < binary.length()) {
result.append(".");
}
}
System.out.println(result);
}
// 将数字转化成二进制,指定生成的最大长度
public static String convertToBinary(long num, int max) {
String[] rs = new String[max];
Arrays.fill(rs, "0");
int l = max - 1;
while (num > 0 && l >= 0) {
rs[l] = num % 2 + "";
num = num / 2;
l--;
}
return String.join("", rs);
}
// 二进制转化成十进制
public static long toDecimal(String binaryStr) {
char[] charArr = binaryStr.toCharArray();
long rs = 0;
long b=1;
for (int i = charArr.length - 1; i >= 0; i--, b *= 2) {
if (charArr[i] == '1') {
rs += b;
}
}
return rs;
}
}

查看14道真题和解析