问题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