¿Cómo se configura sólo ciertos bits de un byte en C sin afectar al resto?

StackOverflow https://stackoverflow.com/questions/4439078

  •  09-10-2019
  •  | 
  •  

Pregunta

Decir que tengo un byte como esto 1010XXXX donde los valores X podría ser cualquier cosa. Quiero configurar los cuatro bits inferiores a un patrón específico, digamos 1100, mientras que deja los cuatro bits superiores no afectado. ¿Cómo voy a hacer esto el más rápido en C?

¿Fue útil?

Solución

se pueden establecer todos los bits a 0 por bit a bit-AND con los 4 bits puestos a 0 y todos los demás establece en 1 (Este es el complemento de los 4 bits puestos a 1). A continuación, puede bit a bit, o en los bits como lo haría normalmente.

es decir,

 val &= ~0xf; // Clear lower 4 bits. Note: ~0xf == 0xfffffff0
 val |= lower4Bits & 0xf; // Worth anding with the 4 bits set to 1 to make sure no
                          // other bits are set.

Otros consejos

En general:

value = (value & ~mask) | (newvalue & mask);

mask es un valor con todos los bits a ser cambiado (y sólo ellos) establecen en 1 - sería 0xf en su caso. newvalue es un valor que contiene el nuevo estado de los bits -. todos los demás bits son esencialmente ignorados

Este trabajo de todos los tipos para los que operadores de bits son compatibles.

Uso operador de bits o | cuando se quiere cambiar el bit de un byte de 0 a 1.

Uso bit a bit y operador y cuando se quiere cambiar el bit de un byte de 1 a 0

Ejemplo

#include <stdio.h>

int byte;
int chb;

int main() {
// Change bit 2 of byte from 0 to 1
byte = 0b10101010;    
chb = 0b00000100;       //0 to 1 changer byte
printf("%d\n",byte);    // display current status of byte

byte = byte | chb;      // perform 0 to 1 single bit changing operation
printf("%d\n",byte);

// Change bit 2 of byte back from 1 to 0
chb = 0b11111011;       //1 to 0 changer byte

byte = byte & chb;      // perform 1 to 0 single bit changing operation
printf("%d\n",byte);
}

Tal vez hay mejores maneras, no sé. Esto le ayudará por ahora.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top