题解 | #判断两个IP是否属于同一子网#
判断两个IP是否属于同一子网
https://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
// 边界问题需要牢记
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
const input = [];
void (async function () {
// Write your code here
while ((line = await readline())) {
input.push(line);
}
function convertTwo(str) {
return str
.split(".")
.map((e) => Number(e).toString(2).padStart(8, "0"))
.join(".");
}
function isIllegal(ip) {
return (
ip
.split(".")
.map(Number)
.findIndex((e) => e > 255 || e < 0) >= 0
);
}
function isIn(mask, ip1, ip2) {
// 检查IP有效性
if (isIllegal(mask) || isIllegal(ip1) || isIllegal(ip2)) {
console.log(1);
return;
}
const maskArr = convertTwo(mask).split(".");
// 检查掩码二进制
if (!/^1+0+$/g.test(maskArr.join(""))) {
console.log(1);
return;
}
const ip1Arr = convertTwo(ip1).split(".");
const ip2Arr = convertTwo(ip2).split(".");
let flag = true;
for (let i = 0; i < maskArr.length; i++) {
if (
(parseInt(ip1Arr[i], 2) & parseInt(maskArr[i], 2)) !==
(parseInt(ip2Arr[i], 2) & parseInt(maskArr[i], 2))
) {
flag = false;
break;
}
}
console.log(flag ? 0 : 2);
}
isIn(...input.slice(0, 3));
})();
