问题1:子网掩码合法性判断?
分析子网掩码前面都是‘1’,后面都是‘0’,那么换言之就是‘1’和‘0’之间只有一个交界处数字从‘1’变为‘0’,所以只要找到第一个‘1’和‘0’交界处的‘1’的下标,然后判断它之前包含自身是否都是‘1’组成同时它之后全部是‘0’,如果符合那就是合法的,一旦不是那就非法
问题2:如何符合题意快速计算最后的十进制结果?
&运算符可以直接对两个int数进行位运算后转换回int,那么大大减少代码量
如有帮助请点赞哦~!~
def solve(mask, ip1, ip2):
for x in ip1:
if int(x) not in range(0, 256)&nbs***bsp;len(ip1)!=4:
return 1
for x in ip2:
if int(x) not in range(0, 256)&nbs***bsp;len(ip2)!=4:
return 1
for x in mask:
if int(x) not in range(0, 256)&nbs***bsp;len(mask)!=4:
return 1 #ip数值和长度判断
mask_bin = ''.join(list(map(lambda x: bin(int(x))[2:].zfill(8), mask)))
for i in range(len(mask_bin)):
if mask_bin[i] == '1' and mask_bin[i + 1] == '0':
if mask_bin[:i + 1] != '1' * (i + 1)&nbs***bsp;int(mask_bin[i + 1::]) != 0:
return 1 #子网掩码合法性判断
l1 = []
l2 = []
for i in range(4):
l1.append(int(bin(int(ip1[i]) & int(mask[i])), 2)) #十进制之间进行位运算
for i in range(4):
l2.append(int(bin(int(ip2[i]) & int(mask[i])), 2))
if l1 == l2: #判断是否在同一子网
return 0
else:
return 2
while True:
try:
mask,ip1,ip2 = input().split('.'),input().split('.'),input().split('.')
print(solve(mask,ip1,ip2))
except:
break 
京公网安备 11010502036488号