2008-10-16 192 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