转化为二进制进行运算:
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