题解 | #整数与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
有些案例会溢出