题解 | #整数与IP地址间的转换#

https://www.nowcoder.com/practice/66ca0e28f90c42a196afd78cc9c496ea

模拟 + 位运算

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String line1 = in.nextLine();
        // int n = in.nextInt();
        long n = in.nextLong();

        /**
         * ip to int
         * 1、以 '.' 分割 ip地址
         * 2、将分割后的数组 arr 拼接为 32 为二进制
         * 3、将32位二进制转化为十进制
         */
        String[] arr = line1.split("\\.");
        String strBinary1 = "";
        for (int i = 0; i < arr.length; i++) {
            strBinary1 += ten2two(Integer.parseInt(arr[i]), 8);
        }
        long sum = two2ten(strBinary1);

        /**
         * int to ip
         * 1、十进制化为 32 位二进制;
         * 2、从前到后,每8个一截取 --> 化为十进制
         */
        String res = "";
        String strBinary2 = ten2two(n, 32);
        for (int i = 0; i < 32; i += 8) {
            String cnt = strBinary2.substring(i, i + 8);
            res += two2ten(cnt);
            if (i + 8 < 32) {
                res += ".";
            }
        }
        System.out.println(sum);
        System.out.println(res);
        in.close();
    }

    /**
     * 十进制转化为 len 位二进制
     *
     * @param n
     * @param len
     * @return
     */
    static String ten2two(long n, int len) {
        StringBuilder s = new StringBuilder();
        for (int i = 0; i < len; i++) {
            s.append(n & 1);
            n >>>= 1;
        }
        return s.reverse().toString();
    }

    /**
     * 二进制转化为十进制
     *
     * @param s
     * @return
     */
    static long two2ten(String s) {
        long sum = 0;
        long power = 1;
        for (int i = s.length() - 1; i >= 0; i--) {
            if (s.charAt(i) - '0' > 0) {
                sum = sum + (s.charAt(i) - '0') * power;
            }
            power <<= 1;
        }
        return sum;
    }
}

注意: 一定使用 long 类型,使用 int 有些案例会溢出

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务