hi,欢迎访问本站!
当前位置: 首页系统/服务器正文

IPv4 to int32-codewar刷题总结

墨初 系统/服务器 1阅读

thanks a lot for codewar

Description:

Take the following IPv4 address: 128.32.10.1 This address has 4 octets where each octet is a single byte (or 8 bits).

1st octet 128 has the binary representation: 100000002nd octet 32 has the binary representation: 001000003rd octet 10 has the binary representation: 000010104th octet 1 has the binary representation: 00000001

So 128.32.10.1 == 10000000.00100000.00001010.00000001

Because the above IP address has 32 bits, we can represent it as the 32 bit number: 2149583361.

Write a function ip_to_int32(ip) ( JS: ipToInt32(ip) ) that takes an IPv4 address and returns a 32 bit number.

ip_to_int32("128.32.10.1") => 2149583361

 我的代码:

def ip_to_int32(ip): flag='' ip_list=ip.split('.') for i in ip_list: temp=str(bin(int(i))[2:]) #bin()转换之后,字符自动就成为字符串 length=len(temp) if length!=8: #取它的长度,如果不够8位,前面补0,因为每个ip共4字节(byte),每个字节8个比特(bit),当一个二进制的数字长度不够8位时,前面的零会省略掉,此时如果不补充,整体拼接后的int数值是错的。 temp=(8-length)*'0'+temp flag+=temp decimal=int(flag,2) return decimal

 看一下别人写的:

addr = ip.split(".") res = int(addr[0]) << 24 res += int(addr[1]) << 16 res += int(addr[2]) << 8 res += int(addr[3]) return res

 128.32.10.1

10的二进制是            00001010

2560的二进制是101000000000

可以看出101这三个数,往右移8位的话,就成了下面这个数,这在计算机中是最快的一种计算方式,因为它并没有计算,只是将这些数字按规则移动到相应的位置。

int(addr[2])<<8

<<8就相当于2**8,值是256,再乘以int(addr[2]),就是2560.

128<<24   2147483648

32<<16     2097152

[3]          1

然后各个和相加,就是结果。

第二个解决

def ip_to_int32(ip): return int(''.join([(bin(int(x))[2:]).zfill(8) for x in ip.split('.')]),2)

zfill函数可以将字符串右对齐,左边填充0,以达到其中参数指定的长度,

string.rjust(width,'0')可以达到同样的效果,但是此函数功能应该更强大,因为它可以指定填充的内容是什么。

第三个解决

def ip_to_int32(ip): return reduce(lambda acc, x: acc << 8 | x, (int(x) for x in ip.split('.')))

 

标签:
声明:无特别说明,转载请标明本文来源!