2011-05-13 48 views
4

我正在尋找關於如何在python中進行按位運算的建議。Python中的按位運算

我的主要問題是,python的按位運算符具有無限精度,這意味着-1真的是「111 ....... 111」。這不是我想要的。我想模擬真正的硬件,它會有一些固定的精度,比如32位。

下面是一些陷阱:

1)-n應返回一個32位的2的補數(這是很容易通過採用無限精度-n的低32位)

2實現)N >> 3,應該是一個32位數的算術移位,這意味着如果位31爲'1',則移位後的位31:28應該爲'1'。

+1

你可以使用numpy,它已經內置在int32類型中。 http://docs.scipy.org/doc/numpy-1.5.x/reference/arrays.scalars.html – GWW 2011-05-13 15:41:38

+0

GWW:我正準備發佈這個答案。也許你想自己做出答案? – 2011-05-13 15:43:25

+1

@Sven Marnach:當然我可以發表感謝,我不確定他是否想要使用外部庫。 – GWW 2011-05-13 15:45:09

回答

3

在執行任何操作之前,您總是可以添加& ((1<<32) - 1)掩碼以將數字限制爲32位。

class Int32(int): 
    def __neg__(self): 
     return Int32(int.__neg__(self) & ((1 << 32) - 1)) 
    def __rshift__(self, other): 
     if self & (-1 << 31): 
      retval = int.__rshift__(int.__sub__(self, 1<<32), other) 
      return Int32(retval & ((1 << 32) - 1)) 
     else: 
      return Int32(int.__rshift__(self, other)) 
    ... 

>>> -Int32(5) 
4294967291 
>>> (-Int32(5)) >> 1 
4294967293 
+0

這對於>>操作符來說並不適用,雖然對?在某些情況下它會移動0而不是1。 – 2011-05-13 15:50:30

+0

@Das:它可以工作。查看更新。 – kennytm 2011-05-13 15:59:20

+0

好的。尼斯。無論如何,我可以模板這個類?有像Int ? – 2011-05-13 16:03:59

6

您可以使用numpy,它內置了int32類型等等。