¿Cambiar bits en un int en C?

Así que tengo un número de 16 bits. Digamos que el nombre de la variable para ello es Bits. Quiero hacerlo para que los Bits [2: 0] = 001, 100 y 000, sin cambiar nada más. No estoy seguro de cómo hacerlo, porque todo lo que puedo pensar es en ORAR el bit, quiero ser un 1 con 1, pero no estoy seguro de cómo borrar los otros bits para que queden 0. Si alguien Tiene un consejo, lo apreciaría. ¡Gracias!

Para borrar ciertos bits, & con la inversa de los bits que se borrarán. Entonces puedes | en los bits que quieras.

En este caso, usted quiere poner a cero los tres bits más bajos ( 111 en binario o 7 en decimal), por lo tanto, & con ~7 para borrar esos bits.

 Bits = (Bits & ~7) | 1; // set lower three bits of Bits to 001 

union estructuras de union permiten la capacidad de especificar el número de bits que tiene una variable y abordar cada bit de una variable más grande individualmente.

 union { short value; struct { unsigned char bit0 : 1; unsigned char bit1 : 1; unsigned char bit2 : 1; unsigned char bit3 : 1; unsigned char bit4 : 1; unsigned char bit5 : 1; unsigned char bit6 : 1; unsigned char bit7 : 1; unsigned char bit8 : 1; unsigned char bit9 : 1; unsigned char bit10 : 1; unsigned char bit11 : 1; unsigned char bit12 : 1; unsigned char bit13 : 1; unsigned char bit14 : 1; unsigned char bit15 : 1; } bits; } var; 

Ahora tiene una variable llamada var que contiene un entero de 16 bits al que puede hacer referencia var.value , y tiene acceso a cada bit individual de esta variable accediendo a var.bits.bit0 hasta var.bits.bit15 .

Al establecer var.value = 0; todos los bits se ponen a 0 también. Estableciendo var.bits.bit0 = 1; cambia automáticamente el valor de var.value a 0x8000 , o como se ve en binario, 1000000000000000 .

Si su intención es cambiar solo los 3 últimos bits, puede simplificar la estructura a algo más como esto:

 union { short value; struct { unsigned short header : 13; unsigned char bit13 : 1; unsigned char bit14 : 1; unsigned char bit15 : 1; } bits; } var; 

Ahora tienes var.bits.header , que es una variable de 13 bits, y otras 3 variables de 1 bit con las que puedes jugar.

Pero tenga en cuenta que C ++ no admite este tipo de estructura, por lo tanto, para la mejor portabilidad de C a C ++, es posible que prefiera utilizar operaciones bitwise en lugar de las propuestas por @nneonneo.