HJ39 判断两个IP是否属于同一子网
采用位与运算,判断IP是否在同一子网。为了简化,把四段二进制,转化为一段二进制,进行与运算判断。因为不管是四段二进制或一段二进制最终判断结果都是看其网络地址是否相同。
这里的IP地址合法性判断较为简洁,只要在0-255内均为合法。
掩码判断为前一段是1,后一段是0不可0,1穿插。
1 ''' 2 测试案例,3个输入为一组 3 255.255.255.0 4 192.168.224.256 5 192.168.10.4 6 255.0.0.0 7 193.194.202.15 8 232.43.7.59 9 255.255.255.0 10 192.168.0.254 11 192.168.0.1 12 13 1 14 2 15 0 16 ''' 17 18 def tos(item):#地址转换成二进制字符串 19 for i in item: 20 if not 255>=int(i)>=0: 21 return False 22 s='' 23 for i in item: 24 if len(bin(int(i))[2:])<8: 25 s=s+"0"*(8-len(bin(int(i))[2:]))+bin(int(i))[2:] 26 else: 27 s=s+bin(int(i))[2:] 28 return s 29 def maskc(item):#判断子网掩码合法 30 s=tos(item) 31 if s: 32 if "0" not in s or "1" not in s: 33 return False 34 while "0"==s[-1]: 35 s=s[:-1] 36 if '0' in s: 37 return False 38 else: 39 return True 40 else: 41 return False 42 def ipc(a): #判断IP合法 43 for i in a: 44 if not 255>=int(i)>=0: 45 return False 46 return True 47 def samenet(item,item1,item2):#判读是否同一子网 48 bmask=tos(item) 49 i1=tos(item1) 50 i2=tos(item2) 51 g1=int(i1,2)&int(bmask,2) 52 g2=int(i2,2)&int(bmask,2) 53 #print(g1,g2) 54 if g1==g2: 55 return True 56 else: 57 return False 58 item=input().split(".") 59 if maskc(item): 60 item1=input().split(".") 61 item2=input().split(".") 62 if not ipc(item1) or not ipc(item2): 63 print(1) 64 else: 65 if samenet(item,item1,item2): 66 print(0) 67 else: 68 print(2) 69 else: 70 print(1)