2008-10-16 197 views
27

试图回答解决方案处理IP地址和网络掩码的另一篇文章,我被简单的按位算术卡住了。Python:无符号32位按位算术

在Python中,是否存在一种标准方式来进行按位AND,OR,XOR,NOT操作,假设输入是“32位”(可能是负数)整数或长整数,并且结果必须是长整型在[0,2 ** 32]的范围内?

换句话说,我需要一个可操作的Python对应于无符号长整数之间的C位操作。

编辑:具体的问题是这样的:

>>> m = 0xFFFFFF00 # netmask 255.255.255.0 
>>> ~m 
-4294967041L   # wtf?! I want 255 
+0

我想Pythons宽松打字会玩这样的任何算法地狱......我也想看到一个,只是出于好奇。 – 2008-10-16 23:40:21

+0

从Python 3.3开始,遇到这种情况的一些用户可能会对[ipaddress模块​​](http://docs.python.org/dev/library/ipaddress)感兴趣。 – gerrit 2014-02-05 09:41:24

回答

36

您可以通过0xFFFFFFFF掩盖了一切:

>>> m = 0xFFFFFF00 
>>> allf = 0xFFFFFFFF 
>>> ~m & allf 
255L 
9
from numpy import uint32 
+0

不便携式,但它的工作原理。 +1 – 2008-10-17 00:17:59

+2

为什么不能携带? – gerrit 2014-02-05 09:40:41

49

您可以使用ctypes及其c_uint32

>>> import ctypes 
>>> m = 0xFFFFFF00 
>>> ctypes.c_uint32(~m).value 
255L 

因此,我在这里做的铸造一个C 32位无符号整数并以Python格式返回其值。

1

这是我创建了一个很久以前的一个模块,它可能对你有所帮助:

IPv4Utils

它提供至少一个带子网算术的CIDR类。例如,检查模块末尾的测试用例。

0

你也可以用0xFFFFFFFF进行异或,这相当于“无符号补码”。

>>> 0xFFFFFF00^0xFFFFFFFF 
255