题解 | #整数与IP地址间的转换#
整数与IP地址间的转换
https://www.nowcoder.com/practice/66ca0e28f90c42a196afd78cc9c496ea
import java.util.*; /** * 原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成 * 一个长整数。 * 举例:一个ip地址为10.0.3.193 * 每段数字 相对应的二进制数 * 10 00001010 * 0 00000000 * 3 00000011 * 193 11000001 * 组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。 * 数据范围:保证输入的是合法的 IP 序列 */ public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNext()) { String strIp = in.nextLine(); String strNum = in.nextLine(); int step = 8; String[] arr1 = strIp.split("\\."); StringBuilder sbDes = new StringBuilder(); for (String s : arr1) { String binStr = Integer.toBinaryString(Integer.parseInt(s)); StringBuilder sb = new StringBuilder(binStr); for (int i = 0; i < step - binStr.length(); i++) {//补齐不够8位的0 sb.insert(0, '0'); } sbDes.append(sb); } long d = Long.parseLong(sbDes.toString(), 2); System.out.println(d); //十进制转ip long n = Long.parseLong(strNum); String bs2 = Long.toBinaryString(n); StringBuilder sb2 = new StringBuilder(bs2); int j = sb2.length() % step;//除以8有余数时,要补齐0 if (j > 0) { for (int i = 0; i < step-j; i++) { sb2.insert(0, '0'); } } int size = (int) (sb2.length() / step + 0.5f); String[] arr2 = new String[size];//00001010 00000000 00000011 11000001 int start = 0, end = step; for (int i = 0; i < arr2.length; i++) { arr2[i] = sb2.substring(start, end); start = end; end += step; } StringBuilder sb3 = new StringBuilder(arr2.length * 2 - 1); for (String s : arr2) { int i = Integer.parseInt(s, 2); sb3.append(i).append('.'); } String des2 = sb3.substring(0, sb3.length() - 1); System.out.println(des2); } } }