题解 | #密码截取#

整数与IP地址间的转换

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

光使用二进制转换还不行,转换过后的整数太大,long型也装不下,手写大整数加法太费时间,使用java大整数类轻松解决
public static BigInteger enCode(String ip) {
        String strs[] = ip.split("\\.");
        BigInteger ips[][] = new BigInteger[4][8];
        for (int i = 0; i < 4; i++) {
            int temp = Integer.valueOf(strs[i]);
            for (int j = 0; j < 8; j++) {
                if ((temp & (1 << j)) == 0)
                    ips[i][j] = new BigInteger("0");
                else ips[i][j] = new BigInteger("1");
            }
        }
        BigInteger bigInteger = new BigInteger("0");

//        long result = 0;
        for (int i = 3, k = 0; i >= 0; i--, k++)
            for (int j = 0; j < 8; j++) {
                bigInteger = bigInteger.add(new BigInteger(String.valueOf(ips[i][j].shiftLeft(j + k * 8))));
            }
        return bigInteger;
    }

    public static String deCode(long value) {
        int[] ips = new int[32];
        for (int i = 0; i < 32; i++) {
            ips[i] = (value & (1 << i)) == 0 ? 0 : 1;
        }
        int ipss[] = new int[4];
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 8; j++) {
                ipss[i] += ips[i * 8 + j] << j;
            }
        }

        List<String> list = new ArrayList<>();
        for (int i = 3; i >= 0; i--) {
            list.add(String.valueOf(ipss[i]));
        }
        return String.join(".", list);
    }

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

        while (sa.hasNext()) {
            String ip = sa.nextLine();
            String intIp = sa.nextLine();
            System.out.println(enCode(ip).toString());
            System.out.println(deCode(Long.valueOf(intIp)));
        }
    }

全部评论

相关推荐

不愿透露姓名的神秘牛友
04-15 15:45
天杀的,早知道读完高中随便考个大专就行了
bugfree小菜狗:人家进去是国企里面的一线员工你愿意去吗和兄弟们想去坐办公室不是一个难度啊
点赞 评论 收藏
分享
希望被捞的猫头鹰很理智:大概率待遇低怕硕士跑路
点赞 评论 收藏
分享
Yki_:以下条件优先录用: 喜欢去缅北当猪仔的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务