题解 | #整数与IP地址间的转换#
整数与IP地址间的转换
https://www.nowcoder.com/practice/66ca0e28f90c42a196afd78cc9c496ea
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { //获得二进制 public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); // 注意 hasNext 和 hasNextLine 的区别 String str=null; while((str=in.readLine())!=null) { //输入类型:1 输入IP地址 // 2 输入10进制型的IP地址 String[] ip=str.split("\\."); long num=Long.parseLong(in.readLine()); System.out.println(Long.parseLong(ip[0])<<24|Long.parseLong(ip[1]) << 16 | Long.parseLong(ip[2]) << 8 | Long.parseLong(ip[3]));//通过位移和组合每个八位字节 StringBuffer sb=new StringBuffer(); sb.append(String.valueOf((num >> 24) & 255)).append(".").append(String.valueOf((num >> 16) & 255)).append(".").append(String.valueOf((num >> 8) & 255)).append(".").append(String.valueOf(num & 255)); System.out.println(sb); } } }
将IPv4地址从点分十进制格式转换为一个长整数(long
)格式的过程。IPv4地址由四组八位字节组成,每组字节之间用点(.
)分隔。每组字节可以是一个介于0到255之间的十进制数。
代码中的 ip
数组应该是一个包含四个字符串元素的数组,每个元素对应IPv4地址中的一个部分。例如,如果 ip
是 new String[]{"192", "168", "1", "1"}
,那么它代表的IP地址是 192.168.1.1
。
下面是这行代码的实现过程:
- Long.parseLong(ip[0]):将 ip[0] 转换为一个长整数,对于例子中的IP地址,这将是 192L。
- << 24:将上一步得到的长整数左移24位。左移24位意味着将 192 乘以 (2^{24}),结果是 192 * 16777216。因为这里只考虑最高位,结果的最高位将为 11000000 00000000 00000000 0(二进制表示)。
- Long.parseLong(ip[1]) << 16:对 ip[1] 执行相同的操作,但这次左移16位,结果将为 168 * 65536,二进制表示为 10101000 00000000 00000000 0。
- Long.parseLong(ip[2]) << 8:对 ip[2] 执行左移8位操作,结果为 1 * 256,二进制表示为 00000001 00000000 00000000 0。
- Long.parseLong(ip[3]):将 ip[3] 转换为长整数,但不需要位移,结果为 1。
- |:这是一个按位或(bitwise OR)操作符。它将上一步得到的四个结果进行按位或操作,将它们组合成一个单一的长整数。
最终,这行代码将产生一个长整数,其二进制表示与原始的点分十进制IP地址相对应。对于例子中的IP地址 192.168.1.1
,转换结果将是:
11000000 10101000 00000001 00000001
这是 192.168.1.1
的二进制表示,转换为长整数就是这个IP地址的数值形式。
正确的代码应该是:
System.out.println((Long.parseLong(ip[0]) << 24) | (Long.parseLong(ip[1]) << 16) | (Long.parseLong(ip[2]) << 8) | Long.parseLong(ip[3]));
这样,每个部分的结果将被正确地组合在一起,并打印出来。