题解 | #密码截取#
整数与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)));
}
} 