Comment définissez-vous que certains bits d'un octet en C sans affecter le reste?

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

  •  09-10-2019
  •  | 
  •  

Question

Dire que j'ai un octet comme celui-ci 1010XXXX où les valeurs X pourraient être quelque chose. Je veux mettre les quatre bits de poids faible à un motif spécifique, par exemple 1100, tout en laissant les quatre bits supérieurs non affecté. Comment puis-je faire cela le plus rapide en C?

Était-ce utile?

La solution

Vous pouvez régler tous les bits à 0 par-Anding avec bitwise les 4 bits à 0 et tous les autres ensemble à 1 (Ceci est le complément des 4 bits à 1). Vous pouvez ensuite ou dans bitwise les bits comme vous le feriez normalement.

soit

 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.

Autres conseils

En général:

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

mask est une valeur avec tous les bits à modifier (et seulement eux) mis à 1 - il serait 0xf dans votre cas. newvalue est une valeur qui contient le nouvel état de ces bits -. tous les autres bits sont essentiellement ignorés

Cela fonctionne pour tous les types pour lesquels les opérateurs binaires sont pris en charge.

Utilisez opérateur ou au niveau du bit | lorsque vous voulez changer le bit d'un octet de 0 à 1.

Utilisez l'opérateur et au niveau du bit et quand vous voulez changer le bit d'un octet de 1 à 0

Exemple

#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);
}

Peut-être il y a de meilleures façons, je ne sais pas. Cela vous aidera pour l'instant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top