原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成
一个长整数。
举例:一个ip地址为10.0.3.193
每段数字 相对应的二进制数
10 00001010
0 00000000
3 00000011
193 11000001
组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。
数据范围:保证
输入描述:
输入
1 输入IP地址
2 输入10进制型的IP地址
输出描述:
输出
1 输出转换成10进制的IP地址
2 输出转换后的IP地址
输入的是合法的 IP 序列
输入10.0.3.193
167969729
输出167773121
10.3.3.193
import java.util.Scanner;
public class Demo3302 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String s = sc.next();
if (s.contains(".")) {
System.out.println(ip2num(s));
} else {
System.out.println(num2ip(Long.parseLong(s)));
}
}
}
private static long ip2num(String ip) {//输入ip输出10进制
String[] iip = ip.split("\\.");//特殊字符的处理
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 4; i++) {
int num = Integer.parseInt(iip[i]);// 拆分
String num2 = Integer.toBinaryString(num);//转换为二进制
while (num2.length() < 8) {
num2 = "0" + num2; // 拼接
}
sb.append(num2);
}
return Long.parseLong(sb.toString(), 2);// 2转化为10进制
}
public static String num2ip(long num) {//输入10进制输出ip
String num1 = Long.toBinaryString(num); //转换为2进制
while (num1.length() < 32) {
num1 = "0" + num1;
}
String[] ip = new String[4];
for (int i = 0; i < 4; i++) {
String a = num1.substring(i * 8, 8 + i * 8);//拆分
a = Integer.toString(Integer.parseInt(a, 2));//转化为10进制
ip[i] = a;
}
//String s = ip[0] + "." + ip[1] + "." + ip[2] + "." + ip[3];//其实这个拼接更快
String s=String.join(".",ip);//拼接
return s;
}
}
总结:2进制以0b开头,8进制0开头,10进制正常输出,十六进制0x
所有进制转化的问题都可以用 String.valueOf(n(x)), n 来转化成10进制再转其他
如16进制转10进制
int n10 = Integer.parseInt(String.valueOf((n16)), 16);
10进制转2,8,16
String n2=Integer.toBinaryString(n10);
String n8 = Integer.toOctalString(n10);
String n16=Integer.toHexString(n10);