题解 | #判断两个IP是否属于同一子网#
判断两个IP是否属于同一子网
https://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218
HJ39 判断两个IP是否属于同一子网
描述
示例:
I P 地址 192.168.0.1
子网掩码 255.255.255.0
转化为二进制进行运算:
I P 地址 11000000.10101000.00000000.00000001
子网掩码 11111111.11111111.11111111.00000000
AND运算 11000000.10101000.00000000.00000000
转化为十进制后为:
192.168.0.0
I P 地址 192.168.0.254
子网掩码 255.255.255.0
转化为二进制进行运算:
I P 地址 11000000.10101000.00000000.11111110
子网掩码 11111111.11111111.11111111.00000000
AND运算 11000000.10101000.00000000.00000000
转化为十进制后为:
192.168.0.0
1. 掩码与IP每一段在 0 - 255 之间
2. 掩码的二进制字符串前缀为网络号,都由‘1’组成;后缀为主机号,都由'0'组成
输入描述:
3行输入,第1行是输入子网掩码、第2,3行是输入两个ip地址
题目的示例中给出了三组数据,但是在实际提交时,你的程序可以只处理一组数据(3行)。
输出描述:
若IP地址或子网掩码格式非法则输出1,若IP1与IP2属于同一子网络输出0,若IP1与IP2不属于同一子网络输出2
// 循环输入多组子网掩码与IP
while(ipMask = readline()){
// let {ipMask, ip1, ip2} = {ipMask, readline(), readline()};
ipMask = ipToTwo(ipMask)
let ip1 = ipToTwo(readline())
let ip2 = ipToTwo(readline())
if( !ipMask || !ip1 || !ip2 || !isMask(ipMask)){
print(1)
}else if(logicAND(ipMask,ip1) == logicAND(ipMask,ip2)){
print(0)
}else{
print(2)
}
}
/** 将IP转换为二进制 10000000.10100000.10000000.00000000 */
function ipToTwo(ip){
let arr = ip.split('.').map(v=>(Number(v)>=0&&Number(v)<=255)? Number(v):false)
if(arr.indexOf(false)!=-1) return false
arr = arr.map(i=> parseInt(i,10).toString(2).padStart(8,'0') )
return arr.join('')
}
/** 将两个IP做逻辑与计算and */
function logicAND(ips1,ips2){
let str1 = ips1.split('.').join('')
let str2 = ips2.split('.').join('')
let result = []
for(let i=0; i < str1.length; i++){
let num = Number(str1[i])&Number(str2[i])
result.push(num)
if (i % 8 == 0 && i != 0) {
result.push('.')
}
}
return result.join('')
}
/** 判断子网掩码是否合法
* 查看是否 0 是否 在 最后一个 1 的后面
* 简单说 从前往后走到第一个0的代价 一定是 大于 从后往前走到第一个1的代价
*/
function isMask(ip) {
return ip.indexOf('0') > ip.lastIndexOf(1);
}
web技术
查看21道真题和解析