В C я мог бы, например, обнулить бит # 10 в 32 разрядное беззнаковое значение, как так:Как я могу манипулировать битами в Python?
unsigned long value = 0xdeadbeef;
value &= ~(1<<10);
Как сделать это в Python?
В C я мог бы, например, обнулить бит # 10 в 32 разрядное беззнаковое значение, как так:Как я могу манипулировать битами в Python?
unsigned long value = 0xdeadbeef;
value &= ~(1<<10);
Как сделать это в Python?
Битовые операции по Интс Python работают так же, как в С. &, | и^-операторы в Python работают так же, как в C. Оператор ~ работает как для знакового целого числа в C; то есть ~ x вычисляет -x-1.
Вы должны быть осторожны с левыми сдвигами, поскольку целые числа Python не являются фиксированными. Используйте бит-маски для получения бит младшего порядка. Например, чтобы сделать эквивалент сдвига 32-разрядного целого числа do (x < < 5) & 0xffffffff.
value = 0xdeadbeef
value &= ~(1<<10)
Вы пытались копировать и вставлять свой код в Python REPL, чтобы узнать, что произойдет?
>>> value = 0xdeadbeef
>>> value &= ~(1<<10)
>>> hex (value)
'0xdeadbaef'
опускаем беззнаковое долго ", и точка с запятой не нужны либо:
value = 0xDEADBEEF
value &= ~(1<<10)
print value
"0x%08X" % value
Python имеет стиль C операторы бит манипуляции, так что ваш пример буквально то же самое в Python, за исключением без введите ключевые слова.
value = 0xdeadbeef
value &= ~(1 << 10)
Если вы собираетесь делать много манипуляций с битами (и вы заботитесь гораздо больше о читаемости, а не производительности для своего приложения), тогда вы можете создать целочисленную оболочку, чтобы разрезать нарезку, как в 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
Вы должны также проверить BitArray, что приятный интерфейс для работы с последовательностями битов.
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)