Python:无符号32位逐位算术

时间:2008-10-16 23:25:31

标签: python math

尝试回答其解决方案涉及IP地址和网络掩码的其他帖子,我陷入了简单的按位算法。

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

换句话说,我需要一个有效的Python对应于无符号长整数之间的C位运算。

编辑:具体问题是:

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

5 个答案:

答案 0 :(得分:51)

您可以使用ctypes及其c_uint32

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

所以我在这里做的是将~m转换为C 32位无符号整数并以Python格式检索其值。

答案 1 :(得分:38)

您可以按0xFFFFFFFF屏蔽所有内容:

>>> m = 0xFFFFFF00
>>> allf = 0xFFFFFFFF
>>> ~m & allf
255L

答案 2 :(得分:10)

from numpy import uint32

答案 3 :(得分:1)

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

IPv4Utils

它提供至少一个带有子网算术的CIDR类。检查模块末尾的测试用例以获取示例。

答案 4 :(得分:0)

您还可以使用0xFFFFFFFF xor,这相当于“unsigned complement”。

>>> 0xFFFFFF00 ^ 0xFFFFFFFF
255