题解 | #密码截取#
整数与IP地址间的转换
http://www.nowcoder.com/practice/66ca0e28f90c42a196afd78cc9c496ea
光使用二进制转换还不行,转换过后的整数太大,long型也装不下,手写大整数加法太费时间,使用java大整数类轻松解决
public static BigInteger enCode(String ip) { String strs[] = ip.split("\\."); BigInteger ips[][] = new BigInteger[4][8]; for (int i = 0; i < 4; i++) { int temp = Integer.valueOf(strs[i]); for (int j = 0; j < 8; j++) { if ((temp & (1 << j)) == 0) ips[i][j] = new BigInteger("0"); else ips[i][j] = new BigInteger("1"); } } BigInteger bigInteger = new BigInteger("0"); // long result = 0; for (int i = 3, k = 0; i >= 0; i--, k++) for (int j = 0; j < 8; j++) { bigInteger = bigInteger.add(new BigInteger(String.valueOf(ips[i][j].shiftLeft(j + k * 8)))); } return bigInteger; } public static String deCode(long value) { int[] ips = new int[32]; for (int i = 0; i < 32; i++) { ips[i] = (value & (1 << i)) == 0 ? 0 : 1; } int ipss[] = new int[4]; for (int i = 0; i < 4; i++) { for (int j = 0; j < 8; j++) { ipss[i] += ips[i * 8 + j] << j; } } List<String> list = new ArrayList<>(); for (int i = 3; i >= 0; i--) { list.add(String.valueOf(ipss[i])); } return String.join(".", list); } public static void main(String[] args) { Scanner sa = new Scanner(System.in); while (sa.hasNext()) { String ip = sa.nextLine(); String intIp = sa.nextLine(); System.out.println(enCode(ip).toString()); System.out.println(deCode(Long.valueOf(intIp))); } }