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)

 

posted @ 2023-05-03 09:37  Aneverforget  阅读(28)  评论(1编辑  收藏  举报