题解 | #整数与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; }
知识点:
- number 怎么转成二进制,将ip四段的二进制转成十进制的数
- 类型转换 要把输入的String转成Number
- 利用二进制法则,num 不断除以 2,直到为0。最后把余数拼起来
- 题目要求ip每段都转成8位的二进制,所以不足8位要补0
- 将二进制转成十进制,parseInt(string, 2),第二个参数表示第一个参数是多少进制的
- 把一个数转成IP,就是上述过程的逆过程
- 关键点在于利用二进制法则得到的数,要记得补位,此时是32位
- 得到32位二进制后,再依次分割成四段ip的二进制
- 再将二进制转十进制,再用'.'连接成ip
所以,这道题的点就在于进制转换你会不会。
注意:这道题你也可以利用这个方法 parseInt(string).toString(2) 进行 十进制转二进制