试图回答另一个解决方案处理 IP 地址和网络掩码的帖子时,我被简单的按位算术困住了。
假设输入是“32位”(可能是负数)整数或长整数,并且结果必须在范围内很长 [ 0, 2**32]?
换句话说,我需要一个工作 Python 对应于无符号长整数之间的 C 位运算。
编辑:具体问题是这样的:
>>> m = 0xFFFFFF00 # netmask 255.255.255.0
>>> ~m
-4294967041L # wtf?! I want 255
您可以使用ctypes及其c_uint32
:
>>> import ctypes
>>> m = 0xFFFFFF00
>>> ctypes.c_uint32(~m).value
255L
所以我在这里所做的是转换~m
为 C 32 位无符号整数并以 Python 格式检索其值。
您可以通过以下方式屏蔽所有内容0xFFFFFFFF
:
>>> m = 0xFFFFFF00
>>> allf = 0xFFFFFFFF
>>> ~m & allf
255L
from numpy import uint32
您也可以与 0xFFFFFFFF 进行异或,这相当于“无符号补码”。
>>> 0xFFFFFF00 ^ 0xFFFFFFFF
255