转化为二进制进行运算:

I P 地址   11000000.10101000.00000000.00000001

子网掩码 11111111.11111111.11111111.00000000

AND运算   11000000.10101000.00000000.00000000

### 根据以上可以得到 比如子网掩码有n个1,对应两个ip 前n位相同,后面不用管(因为任何和1相&都是本身,与0相&都是0)。就可以确定他们是相同网段。

def check_ip(ip, flag):  # 检查ip是否合法
#flag 是掩码算出来多少个1

    flag = flag+1
    ip_list = ip.split('.')
    for i in ip_list:
        if int(i) < 0 or int(i) > 255:
            return False, 0
    if len(ip_list) != 4:
        return False, 0  #0无任何意义(下面也是相同)。避免程序报错 因为我两个参数去接收它,避免报错
    ip_ob = []
    for i in ip_list:  #将ip转为二进制
        i = bin(int(i))
        i = i[2:]
        ip_ob.append(i.zfill(8))  # 不够八位 0填充
    ip_same_subnet = ''.join(ip_ob)
    ip_same_subnet = ip_same_subnet[:flag]  # 将flag个截取出来 和另外一个ip2相比如果相同就是同网段
    return True, ip_same_subnet


def check_mask(mask): # 检查子网掩码是否合法

    mask_list = mask.split('.')
    for i in mask_list:
        if int(i) < 0 or int(i) > 255:
            return False, 0

    mask_ob = []
    for i in mask_list:
        i = bin(int(i))
        i = i[2:]
        mask_ob.append(i.zfill(8))
    mask_ob_str = ''.join(mask_ob)
    find_start0 = mask_ob_str.find('0')
    find_end1 = mask_ob_str.rfind('1')  # 找出多少个1 如果是10个1  将ip1 和 ip2 也转为二进制。如果这两个ip的前10 都相同 就是同一个ip
    if (find_end1+1) == find_start0:
        return True, find_end1
    else:
        return False, 0


while True:

    try:
        a_mask = input()
        a_ip = input()
        b_ip = input()
        mask_check, mask_same_subnet = check_mask(a_mask)
        a_ip_check, a_ip_same = check_ip(a_ip, mask_same_subnet)
        b_ip_check, b_ip_same = check_ip(b_ip, mask_same_subnet)
        if mask_check and a_ip_check and b_ip_check:  #  判断是否ip 和掩码合法
###### if a_ip_same == b_ip_same:  # **两个ip(根据掩码的二进制有多少个1,假如8个1 24个0) 将两个ip转为二进制,将前八位判断是否相同来确定是否相同网段**
                print(0)
            else:
                print(2)
        else:
            print(1)

    except:
        break