4.7. Opérateurs de manipulation de bits – masques (ET bit à bit, décalage…)

Icône de l'outil pédagogique Opérateurs de manipulation de bits – masques (ET bit à bit, décalage…)

Quand on veut modifier ou connaître certains bits d'une variable au lieu de sa totalité, il faut utiliser les opérateurs de manipulation de bits. Ces opérateurs sont très utiles en informatique industrielle.
Une opération bit à bit s’applique à chaque bit de ses opérandes, lesquels sont des entiers.

 

Les opérateurs de manipulation de bits disponibles

Le Langage C offre la possibilité de réaliser des opérations bit à bit du type :

ET, OU, OU EXCLUSIF (entre deux entiers) ;
– complément à 1 ;
– opérations de décalage à droite ou à gauche (sur un entier).
Les opérateurs C correspondants sont donnés dans le tableau suivant :

 

 

Illustrons cette table avec des exemples d'utilisation :

 

Exemple 15 : Opérateur de bits

Les opérateurs de décalage précisent le nombre de bits du décalage (a>>5 pour un décalage de 5 bits vers la droite, b<<1 pour un décalage de 1 bit vers la gauche). Dans le décalage à gauche, les "bits de gauche" sont perdus et des bits 0 apparaissent à droite. Dans le décalage à droite, les "bits de droite" sont perdus et des bits 0 ou 1 apparaissent à gauche (0 si a est non signé ; dépendent de la machine si a est signé).

 

Une notion très utile : le masque.

Les opérateurs de bits sont souvent employés avec la notion de masque, en informatique industrielle notamment.

Un masque est une succession binaire destinée à indiquer la position des bits concernés par une opération (voir dessin). Un ‘1’ dans le masque indique que le bit est concerné, un ‘0’ qu’il ne l’est pas. On peut aussi utiliser le « masque inversé » pour certaines opérations comme la mise à 0 d’un bit.
Le masque s’exprime en général sous la forme d’une constante hexadécimale (0xF0, 0x03, 0x40...) ou peut être fabriqué par décalage s’il concerne un seul bit (1<<6, ~(1<<n)).

 

 

Comment utiliser le masque ?


Une mise à 1 se fait avec l’opérateur OU, une mise à 0 par l’opérateur ET.

Voici quelques applications très utiles des opérateurs de manipulation de bits (voir les dessins des exemples plus loin). Ils utilisent tous comme opérandes une variable a et un masque qui indique l'emplacement des bits concernés :

- accès à certains bits d'une valeur en masquant les autres bits (utilisation de l'opérateur ET) :

a & 0x0F permet d'isoler les 4 bits de poids faible de a (masque des 4 bits LSB : 0x0F).
a & (1<<n) pour connaître la valeur du nème bit de a (expr. nulle si le bit est nul). Voir dessin.Si n=2, le masque 1<<n vaut 1<<2 = (00 ...00100)2. Notez que les parenthèses autour de 1<<n ne sont pas indispensables.
a & (1<<n) est nul si le nème bit de a vaut 0, non nul s'il vaut 1.

- mise à 0 ou à 1 de certains bits d'une valeur :

a = a | 0x0F met à 1 les 4 bits de poids faible de a ;
a = a & ~(1<<n) met à 0 le nème bit de a. Voir dessin.
a = a | (1<<n) met à 1 le nème bit de a.

 

Exemple 16 : Lecture d'un bit par l'expression a & (1<<n)

 

Exemple 17 : Mise à 0 d’un bit par l’expression a = a & ~(1<<n)

 

Exemple 18 : Mise en oeuvre d’un masque pour connaître la valeur d’un bit

Exemple 19 : Décalage des 4 bits MSB et mise à 1 de bits