题解 | #判断两个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技术