Skip to content

IP地址与int整数的转换

约 430 字大约 1 分钟

2025-03-02

将ip地址转换成10进制整数。

例如,ip地址为10.0.3.193,把每段拆分成一个二进制形式组合起来为00001010 00000000 00000011 11000001,然后把这个二进制数转变成十进制整数就是167773121。

位运算

IP地址中的每一段都是0-255的整数,所以每一段最多8位,即一个字节。

左移8位,或运算。

右移8位,与运算。

import java.util.Scanner;
public class Solution {
    // 将IP地址转换为整型
    public static long ipToInt(String ip) {
        String[] ipSegments = ip.split("\\.");  // 以"."分割IP地址为四段
        // 注意是long,因为ip最多有12位,大于int的8位。
        long result = 0;

        // 遍历每一段,将每一段通过移位组合成最终的整型结果
        for (int i = 0; i < 4; i++) {
            // 左移运算符 << 会将数字的二进制形式左移指定的位数,并在右侧用0补齐。
            // 注意是位运算——|不是逻辑或——||。
            result = (result << 8) | Integer.parseInt(ipSegments[i]);
        }

        return result;
    }

    // 将整型转换为IP地址
    public static String intToIp(long num) {
        StringBuilder ip = new StringBuilder();
        
        // 遍历4次,将每一段IP地址的值取出
        for (int i = 3; i >= 0; i--) {
            ip.insert(0, (num & 255));  // 取出最后8位的值。注意insert方法
            if (i > 0) {
                ip.insert(0, ".");  // 插入"."分隔符
            }
            num >>= 8;  // 右移8位,继续处理下一段。注意是>>=不是>>
        }

        return ip.toString();
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 循环读取输入,直至没有更多输入
        while (scanner.hasNext()) {
            String ip = scanner.next();
            long num = scanner.nextLong();

            // 输出IP地址转换为整型的结果
            System.out.println(ipToInt(ip));
            // 输出整型转换为IP地址的结果
            System.out.println(intToIp(num));
        }

        scanner.close();
    }
}