valores una renombrar reemplazar nombre eliminar columnas columna cambiar python

una - ¿Cómo manipulo bits en Python?



renombrar columnas en python (8)

En CI podría, por ejemplo, poner a cero el bit # 10 en un valor sin signo de 32 bits como ese:

unsigned long value = 0xdeadbeef; value &= ~(1<<10);

¿Cómo hago eso en Python?


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)


¿Has intentado copiar y pegar tu código en Python REPL para ver qué sucederá?

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


Las operaciones a nivel de bit en las operaciones de Python funcionan muy parecidas a las de C. The &, | 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.

Debes tener 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, hacer el equivalente del desplazamiento de un entero de 32 bits do (x << 5) y 0xffffffff.


Omita el ''unsigned long'', y los puntos y comas no son necesarios tampoco:

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 el mismo en Python, excepto sin palabras clave de tipo.

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


Si vas a manipular un poco (y te preocupa mucho más la legibilidad que el rendimiento de tu aplicación), puedes 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]

Productos:

D E A D


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


También debería echarle un vistazo a BitArray , que es una buena interfaz para manejar secuencias de bits.