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

整数与IP地址间的转换

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

const rl = require("readline").createInterface({
    input: process.stdin,
    output: process.stdout,
});

const inputs = [];

rl.on("line", (line) => {
    inputs.push(line);
}).on("close", () => {
    resolve(inputs);
});

function resolve(inputs) {
    for (let i = 0; i < inputs.length; i++) {
        const temp = inputs[i];
        let res;
        if (temp.indexOf(".") > -1) {
            res = ip2num(temp);
        } else {
            res = num2Ip(temp);
        }
        console.log(res);
    }
}

function ip2num(ip) {
    const arr = ip.split(".");
    let num_str = "";
    for (let i = 0; i < arr.length; i++) {
        num_str += num2Binary(arr[i]);
    }

    const num = parseInt(num_str, 2);
    return num;
}

function num2Binary(num) {
    // let binary = parseInt(num).toString(2);
    num = parseInt(num);
    let binary = '';
    
    while(num > 0) {
        binary = num % 2 + binary;
        num = Math.floor(num / 2);
    }
    if(binary.length < 8) {
        const len = 8 - binary.length;

        for (let i = 0; i < len; i++) {
            binary = "0" + binary;
        }
    }

    return binary;
}

function num2Ip(num) {
    let binary = num2Binary(num);
    let zero = '';
    for(let i = 0; i < 32 - binary.length; i++) {
        zero += '0';
    }
    binary = zero + binary;
    const first = binary.slice(0, 8);
    const sec = binary.slice(8, 16);
    const thrid = binary.slice(16, 24);
    const fourth = binary.slice(24, 32);

    const ip =
        parseInt(first, 2) +
        "." +
        parseInt(sec, 2) +
        "." +
        parseInt(thrid, 2) +
        "." +
    parseInt(fourth, 2);

    return ip;
}

知识点:

  1. number 怎么转成二进制,将ip四段的二进制转成十进制的数
  2. 类型转换 要把输入的String转成Number
  3. 利用二进制法则,num 不断除以 2,直到为0。最后把余数拼起来
  4. 题目要求ip每段都转成8位的二进制,所以不足8位要补0
  5. 将二进制转成十进制,parseInt(string, 2),第二个参数表示第一个参数是多少进制的
  6. 把一个数转成IP,就是上述过程的逆过程
  7. 关键点在于利用二进制法则得到的数,要记得补位,此时是32位
  8. 得到32位二进制后,再依次分割成四段ip的二进制
  9. 再将二进制转十进制,再用'.'连接成ip

所以,这道题的点就在于进制转换你会不会。

注意:这道题你也可以利用这个方法 parseInt(string).toString(2) 进行 十进制转二进制

全部评论

相关推荐

牛客717484937号:双飞硕没实习挺要命的
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务