2008-09-29 22 views

答えて

42

ビットごとの演算作業もはるかのようなC. &で、| Pythonの^演算子はCのように動作します。〜演算子はCの符号付き整数として機能します。つまり、〜xは-x-1を計算します。

Pythonの整数は固定幅ではないので、左シフトにはいくらか注意する必要があります。ビットマスクを使用して下位ビットを取得します。たとえば、32ビット整数のシフトに相当するdo(x < < 5)& 0xffffffff。

11
value = 0xdeadbeef 
value &= ~(1<<10) 
3

コードをコピーしてPython REPLに貼り付けてみましたか?

>>> value = 0xdeadbeef 
>>> value &= ~(1<<10) 
>>> hex (value) 
'0xdeadbaef' 
3

省略「unsigned long型」、およびセミコロンはどちらか必要とされていません。

value = 0xDEADBEEF 
value &= ~(1<<10) 
print value 
"0x%08X" % value 
3

あなたの例ではないことを除いて、Pythonで文字通り同じであるので、Pythonは、Cスタイルビット操作演算子を持っていますキーワードを入力します。

value = 0xdeadbeef 
value &= ~(1 << 10) 
Pythonのint型の
0

多くのビット操作を行う場合(アプリケーションのパフォーマンスよりも可読性を重視する場合)、Integerラッパーを作成してVerilogやVHDLなどのスライシングを有効にすることができます。

 
import math 
class BitVector: 
    def __init__(self,val): 
     self._val = val 

    def __setslice__(self,highIndx,lowIndx,newVal): 
     assert math.ceil(math.log(newVal)/math.log(2)) <= (highIndx-lowIndx+1) 

     # clear out bit slice 
     clean_mask = (2**(highIndx+1)-1)^(2**(lowIndx)-1) 

     self._val = self._val^(self._val & clean_mask) 
     # set new value 
     self._val = self._val | (newVal<<lowIndx) 

    def __getslice__(self,highIndx,lowIndx): 
     return (self._val>>lowIndx)&(2L**(highIndx-lowIndx+1)-1) 

b = BitVector(0) 
b[3:0] = 0xD 
b[7:4] = 0xE 
b[11:8] = 0xA 
b[15:12] = 0xD 

for i in xrange(0,16,4): 
    print '%X'%b[i+3:i] 

出力:

 
D 
E 
A 
D 
4

また、ビットのシーケンスを扱うための素晴らしいインターフェースである、BitArrayをチェックアウトする必要があります。

0
a = int('00001111', 2) 
b = int('11110000', 2) 
bin(a & b)[2:].zfill(8) 
bin(a | b)[2:].zfill(8) 
bin(a << 2)[2:].zfill(8) 
bin(a >> 2)[2:].zfill(8) 
bin(a^b)[2:].zfill(8) 
int(bin(a | b)[2:].zfill(8), 2) 
関連する問題