En C Podría, por ejemplo, ajustar a cero el bit # 10 en un valor sin signo de 32 bits de este modo:¿Cómo manipulo bits en Python?
unsigned long value = 0xdeadbeef;
value &= ~(1<<10);
¿Cómo puedo hacer que en Python?
En C Podría, por ejemplo, ajustar a cero el bit # 10 en un valor sin signo de 32 bits de este modo:¿Cómo manipulo bits en Python?
unsigned long value = 0xdeadbeef;
value &= ~(1<<10);
¿Cómo puedo hacer que en Python?
operaciones bit a bit sobre enteros Python trabajar al igual que en C. El &, | y^los operadores en Python funcionan igual que en C. El operador ~ funciona como un entero con signo en C; es decir, ~ x calcula -x-1.
Tienes que tener algo de cuidado con los cambios a la izquierda, ya que los enteros de Python no son de ancho fijo. Use máscaras de bits para obtener los bits de bajo orden. Por ejemplo, para hacer el equivalente de desplazamiento de un entero de 32 bits do (x < < 5) & 0xffffffff.
value = 0xdeadbeef
value &= ~(1<<10)
¿Ha intentado copiar y pegar su código en el REPL de Python para ver qué sucederá?
>>> value = 0xdeadbeef
>>> value &= ~(1<<10)
>>> hex (value)
'0xdeadbaef'
omitir el 'unsigned long', y no son necesarios los puntos y comas, ya sea:
value = 0xDEADBEEF
value &= ~(1<<10)
print value
"0x%08X" % value
Python tiene operadores de manipulación de bits de estilo C, por lo que su ejemplo es literalmente la misma en Python, excepto sin escriba palabras clave
value = 0xdeadbeef
value &= ~(1 << 10)
Si va a realizar mucha manipulación de bits (y se preocupa mucho más por la legibilidad que por el rendimiento de su aplicación), puede crear un envoltorio entero para habilitar el corte como en Verilog o 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]
Salidas:
D E A D
también debe comprobar fuera de BitArray, que es una interfaz agradable para tratar con secuencias de bits.
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)