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

整数与IP地址间的转换

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

  • 常规思路
import java.io.*;
import java.math.BigDecimal;

public class Main {

    // 法一: 常规思路
     public static void main(String[] args) throws IOException {
         BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
         String str1 = bufferedReader.readLine();
         String str2 = bufferedReader.readLine();
         System.out.println(toNumber(str1));
         System.out.println(toIp(str2));
     }

    /**
     * ip地址 转 数字
     *
     * @param string ip地址
     * @return number
     */
    public static BigDecimal toNumber(String string) {
        StringBuilder stringBuilder = new StringBuilder();
        for (String s1 : string.split("\\.")) {
            stringBuilder.append(String.format("%08d", Long.valueOf(Long.toBinaryString(Long.valueOf(s1)))));
        }
//        int i = Integer.parseInt(stringBuilder.toString(), 2);
        return binaryToString(stringBuilder.toString());
    }

    /**
     * 数字 转 ip地址
     *
     * @param string number
     * @return ip地址
     */
    public static String toIp(String string) {
//        long i = Long.parseLong(string);
//        String string2 = Long.toBinaryString(Long.parseLong(string));
//        String string1 = String.format("%032d",Integer.valueOf(Integer.toBinaryString(Integer.parseInt(string))));
//        int i = Integer.parseInt(string1, 2);
        String string1 = addZeroForNum(Long.toBinaryString(Long.parseLong(string)), 32);
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append(Integer.parseInt(string1.substring(0, 8), 2) + ".");
        stringBuilder.append(Integer.parseInt(string1.substring(8, 16), 2) + ".");
        stringBuilder.append(Integer.parseInt(string1.substring(16, 24), 2) + ".");
        stringBuilder.append(Integer.parseInt(string1.substring(24), 2));
        return stringBuilder.toString();
    }

    /**
     * 左右补0
     *
     * @param str
     * @param strLength
     * @return
     */
    public static String addZeroForNum(String str, int strLength) {
        int strLen = str.length();
        if (strLen < strLength) {
            while (strLen < strLength) {
                StringBuffer sb = new StringBuffer();
                sb.append("0").append(str);// 左补0
                // sb.append(str).append("0");//右补0
                str = sb.toString();
                strLen = str.length();
            }
        }
        // 自己实现工具类
        return str;
        // 调用jdk方法
//        return String.format("%"+strLength+"s", Integer.toBinaryString(Integer.parseInt(str))).replace(' ', '0'); // 仅能左侧添加
//        return StringUtils.leftPad(Integer.toBinaryString(Integer.parseInt(str)), strLength, '0'); // 左侧添加
//        return StringUtils.rightPad(Integer.toBinaryString(Integer.parseInt(str)), strLength, '0');// 右侧添加
    }

    /**
     * 二进制转十进制
     *
     * @param str
     * @return
     */
    public static BigDecimal binaryToString(String str) {
        BigDecimal bigDecimal = new BigDecimal(0);
        char[] chars = str.toCharArray();
        for (int i = chars.length; i > 0; i--) {
            BigDecimal temp = new BigDecimal(1);
            if (chars[i - 1] == '1') {
                for (int j = 0; j < str.toCharArray().length - i; j++) {
                    temp = temp.multiply(new BigDecimal(2));
                }
                bigDecimal = bigDecimal.add(temp);
            }
        }
        return bigDecimal;
    }

}

  • 位运算
    // 法二: 位运算
    public static void main(String[] args) throws IOException {
         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
         String str = null;
         while ((str = br.readLine()) != null) {
             String[] ip = str.split("\\.");
             long num = Long.parseLong(br.readLine());
             //转10进制
             // 利用按位或运算,|按位或和&按位与计算方式都是转换二进制再计算
             // 左边高位的 ip地址 移位后低位的位置一定为零,所以和未移位的 ip地址 进行或运算一定为低位的数字
             // 如:2.2 -> 00000010.00000010
             // 移位后     0000001000000000|00000010 -> 0000001000000010
             System.out.println(Long.parseLong(ip[0]) << 24 | Long.parseLong(ip[1]) << 16 |
                                Long.parseLong(ip[2]) << 8 | Long.parseLong(ip[3]));
             //转ip地址
             StringBuilder sb = new StringBuilder();
             // 移位后与255做与运算(保证高于此位置的数字和0做与运算),只保留此次位置范围的
             // 如:299867972
             // 移位后-> 17.4575.1171359.299867972
             // 和255与运算后-> 17.223.159.68
             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.toString());
         }
     }
全部评论

相关推荐

不愿透露姓名的神秘牛友
11-21 19:05
面试官_我太想进步了:混学生会的,难怪简历这么水
点赞 评论 收藏
分享
巧克力1:双选会不如教室宣讲会
点赞 评论 收藏
分享
10-30 22:18
已编辑
毛坦厂中学 C++
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务