Cambiar un Bit en un Byte

Antoni
15 de Febrero del 2010
Tengo un unsigned int por ejemplo este:
0001110101110100
quiero cambiar un bit cualquiera si es cero a 1 si es uno a cero, por ejemplo si cambio el tercero quedaría:
0001110101110000

Capitan Kirk
15 de Febrero del 2010
Lo que quieres hacer se hace mediante las operaciones AND y OR a nivel de bit. Si quiero poner un bit a 1, tengo que hacerlo con un valor que tenga ese bit a 1 y el resto a 0, para que no me cambien.
Supongamos que tenemos 1000. Los bits se numeran de derecha a izquierda, comenzando por 0. En este caso, tenemos los bits 0, 1, 2, 3, con valores respectivos 1, 2, 4, 8. En este caso nuestro número de 4 bits valdría 8.

Ahora queremos poner a 1 el bit 2, es decir, que quede 1100 (=12). El bit 2 vale 4, con lo que tendremos que hacer un OR con 0100:

val = val | 4

con lo que 1000 pasa a ser 1100.

Si quiero poner un bit a 0, tengo que hacerlo con un valor que tenga ese bit a 0 y el resto a 1, para que no me cambien. En este ejemplo, quiero volver a dejar mi valor como estaba, luego tendré que hacer un AND con 1011. Como puedes ver, este patrón es justo el contrario del anterior, con lo que la forma de hacerlo es

val = val & ~4

y val pasa de ser 1100 a ser 1000.

El operador ~ es el operador de negación a nivel de bit, y si no lo tienes directamente en el teclado, se obtiene pulsando la tecla Alt y, sin soltarla, los números 1 2 6 del teclado numérico (ojo, tienen que ser los del teclado numérico, los otros no valen). Con esto, ~4 = ~0100 = 1011.

Espero que esto conteste a tu pregunta. Saludos,