题解 | #整数与IP地址间的转换#
https://www.nowcoder.com/practice/66ca0e28f90c42a196afd78cc9c496ea
模拟 + 位运算
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String line1 = in.nextLine();
// int n = in.nextInt();
long n = in.nextLong();
/**
* ip to int
* 1、以 '.' 分割 ip地址
* 2、将分割后的数组 arr 拼接为 32 为二进制
* 3、将32位二进制转化为十进制
*/
String[] arr = line1.split("\\.");
String strBinary1 = "";
for (int i = 0; i < arr.length; i++) {
strBinary1 += ten2two(Integer.parseInt(arr[i]), 8);
}
long sum = two2ten(strBinary1);
/**
* int to ip
* 1、十进制化为 32 位二进制;
* 2、从前到后,每8个一截取 --> 化为十进制
*/
String res = "";
String strBinary2 = ten2two(n, 32);
for (int i = 0; i < 32; i += 8) {
String cnt = strBinary2.substring(i, i + 8);
res += two2ten(cnt);
if (i + 8 < 32) {
res += ".";
}
}
System.out.println(sum);
System.out.println(res);
in.close();
}
/**
* 十进制转化为 len 位二进制
*
* @param n
* @param len
* @return
*/
static String ten2two(long n, int len) {
StringBuilder s = new StringBuilder();
for (int i = 0; i < len; i++) {
s.append(n & 1);
n >>>= 1;
}
return s.reverse().toString();
}
/**
* 二进制转化为十进制
*
* @param s
* @return
*/
static long two2ten(String s) {
long sum = 0;
long power = 1;
for (int i = s.length() - 1; i >= 0; i--) {
if (s.charAt(i) - '0' > 0) {
sum = sum + (s.charAt(i) - '0') * power;
}
power <<= 1;
}
return sum;
}
}
注意:
一定使用
long类型,使用int有些案例会溢出

