/*
* 解题思路:
* 1. ip转整形: 字符串切割后转二进制, 并拼接计算
* 2. 整形转ip: 转换成二进制, 按8位进行位运算即可
* 其它笔记:
* 1. java二进制的转换和表示(String类型表示)
* 1) 2->10 Integer.parseUnsignedInt(string, 2);
* 2) 10->2 Integer.toBinaryString(int);
* 提交失败:
* 1. int tmpInt = Integer.parseInt(ip); // 数组越界, 没有给出失败用例, 原因不明, 尝试换成parseUnsignedInt()
* 2. 3/10 组用例通过, 原因: 转换结果大于int最大值, 转换为unsigned long类型
*/
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNextLine()) {
System.out.println(ip2int(sc.nextLine()));
System.out.println(int2ip(sc.nextLine()));
}
}
static long ip2int(String ip) {
String[] strs = ip.split("[.]+");
StringBuffer sb = new StringBuffer();
for (int i = 0; i < strs.length; i++) {
// 这里不用转long类型, 因为二进制转换本身就是无符号操作
int tmpInt = Integer.parseUnsignedInt(strs[i]);
String tmpBin = Integer.toBinaryString(tmpInt);
for (int j = 8 - tmpBin.length(); j > 0; j--) {
tmpBin = "0" + tmpBin;
}
sb.append(tmpBin);
}
int tmpRes = Integer.parseUnsignedInt(sb.toString(), 2);
return Integer.toUnsignedLong(tmpRes);
}
static String int2ip(String ip) {
StringBuffer sb = new StringBuffer();
int tmpInt = Integer.parseUnsignedInt(ip);
String tmpBin = Integer.toBinaryString(tmpInt);
for (int i = 32 - tmpBin.length(); i >0; i--) {
tmpBin = "0" + tmpBin;
}
for (int i = 0; i < 4; i++) {
// 这里也不用转, 总共就4字节
int tmpIp = Integer.parseUnsignedInt(tmpBin.substring(i * 8, i * 8 + 8), 2);
sb.append(tmpIp);
if (i != 3) {
sb.append(".");
}
}
return sb.toString();
}
}