¿Cómo modificar bits en un entero?

Tengo un número entero con un valor 7 ( 0b00000111 ) y me gustaría reemplazarlo con una función a 13 ( 0b00001101 ). ¿Cuál es el mejor algoritmo para reemplazar bits en un entero?

Por ejemplo:

 set_bits(somevalue, 3, 1) # What makes the 3rd bit to 1 in somevalue? 

Solo necesitas:

 def set_bit(v, index, x): """Set the index:th bit of v to 1 if x is truthy, else to 0, and return the new value.""" mask = 1 << index # Compute mask, an integer with just bit 'index' set. v &= ~mask # Clear the bit indicated by the mask (if x is False) if x: v |= mask # If x was True, set the bit indicated by the mask. return v # Return the result, we're done. >>> set_bit(7, 3, 1) 15 >>> set_bit(set_bit(7, 1, 0), 3, 1) 13 

Tenga en cuenta que los números de bit ( index ) son de 0, siendo 0 el bit menos significativo.

También tenga en cuenta que se devuelve el nuevo valor, no hay forma de modificar un entero “en su lugar” como se muestra (al menos no lo creo).

Estos funcionan para enteros de cualquier tamaño, incluso mayores de 32 bits:

 def set_bit(value, bit): return value | (1< 

Si te gustan las cosas cortas, puedes usar:

 >>> val = 0b111 >>> val |= (1<<3) >>> '{:b}'.format(val) '1111' >>> val &=~ (1<<1) '1101' 

Puedes usar operaciones a nivel de bit. http://wiki.python.org/moin/BitwiseOperators

Si desea establecer un bit dado en 1, puede usar bitwise ‘o’ con 1 en la posición dada:

0b00000111 | 0b00001000 = 0b00001111

para establecer un bit dado a 0 puede usar bitwise ‘y’

0b00001111 y 0b11111011 = 0b00001011

Tenga en cuenta que el prefijo 0b es para números binarios y 0x es para hexadecimal.