题解 | #整数与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
{ …… }
- 对进制转换要足够熟悉