题解 | 整数与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; } }