2008-09-29 21 views
28

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?

Respuesta

42

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.

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

¿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' 
3

omitir el 'unsigned long', y no son necesarios los puntos y comas, ya sea:

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

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) 
0

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 
4

también debe comprobar fuera de BitArray, que es una interfaz agradable para tratar con secuencias de bits.

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) 
Cuestiones relacionadas