2008-09-29 3 views

ответ

42

Битовые операции по Интс Python работают так же, как в С. &, | и^-операторы в Python работают так же, как в C. Оператор ~ работает как для знакового целого числа в C; то есть ~ x вычисляет -x-1.

Вы должны быть осторожны с левыми сдвигами, поскольку целые числа Python не являются фиксированными. Используйте бит-маски для получения бит младшего порядка. Например, чтобы сделать эквивалент сдвига 32-разрядного целого числа do (x < < 5) & 0xffffffff.

3

Вы пытались копировать и вставлять свой код в Python REPL, чтобы узнать, что произойдет?

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

опускаем беззнаковое долго ", и точка с запятой не нужны либо:

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

Python имеет стиль C операторы бит манипуляции, так что ваш пример буквально то же самое в Python, за исключением без введите ключевые слова.

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

Если вы собираетесь делать много манипуляций с битами (и вы заботитесь гораздо больше о читаемости, а не производительности для своего приложения), тогда вы можете создать целочисленную оболочку, чтобы разрезать нарезку, как в 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) 
Смежные вопросы