题解 | #整数与IP地址间的转换#
整数与IP地址间的转换
https://www.nowcoder.com/practice/66ca0e28f90c42a196afd78cc9c496ea
import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); String ipStr = in.nextLine(); // 保存输入的点分十进制地址 String decimalIpStr = in.nextLine(); // 保存输入的十进制整数 // 1. 点分十进制转换成 十进制整数 String[] ipStrs = ipStr.split("\\."); StringBuilder midRes = new StringBuilder(); for (String str : ipStrs) { // 将各段的十进制转换成二进制 并拼接起来 midRes.append(decToBin(str, 8)); } // System.out.println(midRes); long res1 = getDecRes(midRes); // 2. 十进制整数转换成点分二进制 StringBuilder originalBinStr = decToBin(decimalIpStr, 32); // System.out.println(originalBinStr); // 分段 然后分段转成 十进制 char[] chars = originalBinStr.toString().toCharArray(); StringBuilder midRes2 = new StringBuilder(); StringBuilder res2 = new StringBuilder(); for (int i = 0; i < chars.length; i++) { midRes2.append(chars[i]); if (midRes2.length() % 8 == 0) { res2.append(getDecRes(midRes2)); res2.append("."); midRes2.replace(0, midRes2.length(), ""); // 注意是包头不包尾 } } res2.replace(res2.length() - 1, res2.length(), ""); // 删掉最后的. System.out.println(res1); System.out.println(res2); } /** * 获得二进制对应的十进制整数 * @param midRes * @return */ private static long getDecRes(StringBuilder midRes) { char[] charArray = midRes.toString().toCharArray(); int len = charArray.length; long res1 = 0; for (int i = 0; i < len; i++) { res1 += Long.parseLong(String.valueOf(charArray[i])) * Math.pow(2, len - 1 - i); } return res1; } /** * 将各段的十进制转换成二进制 * @param str 要转换的十进制字符串 * @param num 期望转成的二进制位数 * @return */ private static StringBuilder decToBin(String str, int num) { long dec = Long.parseLong(str); // 十进制转二进制 除以2 倒取余, 终止条件:商为 1 long[] reminders = new long[num]; // 存取计算过程中的余数 long quotient = dec; // 表示计算过程中的商(被除数) int base = 2; // 表示要转换成的进制 int i = 0; // 计算的次数 while (quotient != 1) { reminders[i] = quotient % base; quotient = quotient / base; i++; } StringBuilder binStr = new StringBuilder(); binStr.append(1); // 拼接最后的商 1 for (int j = i - 1; j >= 0; j--) { binStr.append(reminders[j]); } StringBuilder appendStr = new StringBuilder(); if (binStr.length() < num) { int k = num - binStr.length(); // 要填充的 0 个数 for (int l = 0; l < k; l++) { appendStr.append("0"); } } return appendStr.append(binStr); } }
注意事项:
- 需要注意数据的范围 Integer.parseInt() 转换成的是有符号整数。Parses the string argument as a signed integer in the radix specified by the second argument.
public static int parseInt(String s, int radix)
throws NumberFormatException
{ …… }
- 对进制转换要足够熟悉