¿Cuál es la mejor manera de establecer un bit en particular en una variable en C

Considere una variable unsigned int a; Cía.

Ahora diga que quiero establecer cualquier i’th bit en esta variable a ‘1’.

Tenga en cuenta que la variable tiene algún valor. Entonces a=(1<<i) no funcionará.

a=a+(1<<i) funcionará, pero estoy buscando la forma más rápida. ¿¿Cualquier cosa??

Bitwise o eso. por ejemplo, a |= (1<

Algunas macros de manipulación de bits útiles.

 #define BIT_MASK(bit) (1 << (bit)) #define SET_BIT(value,bit) ((value) |= BIT_MASK(bit)) #define CLEAR_BIT(value,bit) ((value) &= ~BIT_MASK(bit)) #define TEST_BIT(value,bit) (((value) & BIT_MASK(bit)) ? 1 : 0) 

La forma más común de hacer esto es:

 a |= (1 << i); 

Esto es sólo dos operaciones: un turno y un OR. Es difícil ver cómo se puede mejorar esto.

Debes usar bitwise O para esta operación.

 a |= 1 << i; 

Probablemente podrías usar

 a |= (1 << i) 

Pero no hará mucha diferencia. En cuanto al rendimiento, no deberías ver ninguna diferencia.

Podría intentar construir una tabla donde 0x0010 i a una máscara de bits (como 2 => 0x0010 para 0000000000100 ), pero eso es un poco innecesario.

Podrías usar un bit a bit o

 a |= (1 << i); 

Tenga en cuenta que esto no tiene el mismo comportamiento que +, que se cargará si ya hay un 1 en el bit que está configurando.

La forma en que implementé las marcas de bits (para citar directamente de mi base de código, puede usarlo libremente para cualquier propósito, incluso comercial):

 void SetEnableFlags(int &BitFlags, const int Flags) { BitFlags = (BitFlags|Flags); } const int EnableFlags(const int BitFlags, const int Flags) { return (BitFlags|Flags); } void SetDisableFlags(int BitFlags, const int Flags) { BitFlags = (BitFlags&(~Flags)); } const int DisableFlags(const int BitFlags, const int Flags) { return (BitFlags&(~Flags)); } 

No se necesita operación de cambio a nivel de bits.

Es posible que tenga que ordenar o alterar el código para usar el conjunto de variables en particular que está usando, pero en general debería funcionar bien.