题解 | #整数与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地址中的一个部分。例如,如果 ipnew String[]{"192", "168", "1", "1"},那么它代表的IP地址是 192.168.1.1

下面是这行代码的实现过程:

  1. Long.parseLong(ip[0]):将 ip[0] 转换为一个长整数,对于例子中的IP地址,这将是 192L。
  2. << 24:将上一步得到的长整数左移24位。左移24位意味着将 192 乘以 (2^{24}),结果是 192 * 16777216。因为这里只考虑最高位,结果的最高位将为 11000000 00000000 00000000 0(二进制表示)。
  3. Long.parseLong(ip[1]) << 16:对 ip[1] 执行相同的操作,但这次左移16位,结果将为 168 * 65536,二进制表示为 10101000 00000000 00000000 0。
  4. Long.parseLong(ip[2]) << 8:对 ip[2] 执行左移8位操作,结果为 1 * 256,二进制表示为 00000001 00000000 00000000 0。
  5. Long.parseLong(ip[3]):将 ip[3] 转换为长整数,但不需要位移,结果为 1。
  6. |:这是一个按位或(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]));

这样,每个部分的结果将被正确地组合在一起,并打印出来。

全部评论

相关推荐

牛客5655:其他公司的面试(事)吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务