题解 | #整数与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) 进行 十进制转二进制
