A类IP地址 第一个字段的取值范围:0-127 默认的子网掩码:255.0.0.0
B类IP地址的第一个字段的取值范围:128-191 默认的子网掩码255.255.0.0
C类IP地址的第一个字段的取值范围:192-223 默认的子网掩码 255.255.255.0
已知IP地址和子网掩码,用IP地址和子网掩码相与即可得到网络号
子网掩码的最后面有几个零,比如n个,即可求出主机数:pow(2,n)-2 (全零用于网络地址,全1用于广播地址)
子网掩码中1的个数可以用于求子网的数目
比如IP地址为151.244.20.34 子网掩码为255.255.255.224,这个IP是B类IP,两者相与,
网络号为151.244.20.32
224用二进制表示为11100000,后面有5个0,则主机数为pow(2,5)-2,其中全0用作网络地址,全1为广播地址
16-5=11,则子网数目为pow(2,11)-2 其中全0用作网络地址,全1为换回测试用
下面的python程序可以判断IP的类别并求对应的网络号:
s=raw_input(); s=s.split("."); mask=raw_input(); mask=mask.split("."); for i in range(0,4): s[i]=int(s[i]); mask[i]=int(mask[i]); if(s[0]>=0 and s[0]<=127): print "A IP"; flag=1; elif(s[0]<=192): print "B IP"; flag=2; elif(s[0]<=223): print "C IP"; flag=3; elif(s[0]>255): print "error"; if(flag is 1): i=0; res=[]; for i in range(0,4): res.append(mask[i]&s[i]); print "network number is %d.%d.%d.%d" %(res[0],res[1],res[2],res[3]); if(flag is 2): res=[]; for i in range(0,4): res.append(mask[i]&s[i]); print "network number is %d.%d.%d.%d" %(res[0],res[1],res[2],res[3]); if(flag is 3): res=[]; for i in range(0,4): res.append(mask[i]&s[i]); print "network number is %d.%d.%d.%d" %(res[0],res[1],res[2],res[3]);
原文:http://blog.csdn.net/u011608357/article/details/33410641