Cours 3.7. Opérateurs de décalage

En C, il existe deux opérateurs permettant le décalage des bits :

s = a >> b;

On s'aperçoit dans l'exemple ci-dessus que ces opérateurs acceptent deux opérandes, il s'agit donc d'opérateurs binaires. Le premier opérande (a) est la variable à décaler. Le deuxième opérande est le nombre de bits du décalage. Si b vaut 2, la variable a sera décalée de deux bits vers la droite.

Exemple 1

Considérons l'exemple suivant :

unsigned char a= 0x3C;
printf ("a << 1 = %d\n", a<<1 );

Pour simuler le résultat de cet opérateur, il convient de suivre la même méthode que pour les opérateurs logique bit à bit. Commençons par convertir la variable a en binaire :

$$ (3C)_{16} = (0011\:1100)_2 $$

Il convient ensuite de décaler le mot binaire vers la gauche de 1 bit :

Opérateur de décalage en C, décalage de trois bits vers la droite.

$$ (0011\:1100)_2 << 1 = (0111\:1000)_2 $$

Notons que le décalage n'est pas une permutation circulaire, le bit de gauche (poids fort) ne revient pas dans le bit de droite. Ici le bit de gauche est perdu. Avec un décalage à gauche, le bit de poids faible (bit de droite) est toujours remplacé par un zéro.

Il suffit maintenant de convertir ce résultat en base 10 pour obtenir l'affichage du programme :

$$ (0111\:1000)_2 = (120)_{10} $$

Vérifons ce résultat :

Exemple 2

Considérons l'exemple suivant :

unsigned char a= 0x3C;
printf ("a >> 3 = %d\n", a>>3 );

La conversion de la variable a en binaire est identique à l'exemple précédent

$$ (3C)_{16} = (0011\:1100)_2 $$

Le schéma général du décalage est représenté par :

Opérateur de décalage en C, décalage d'un bit vers la gauche.

$$ (0011\:1100)_2 >> 3 = (0000\:0111)_2 = (7)_{10}$$

Vérifons ce résultat :

Décalage et multiplication

Un décalage binaire revient à opérer une multiplication ou une division. Lorsque l'on décale à gauche, on multiplie par deux :

Pour les décalages à droite, si l'on omet la partie décimale du résultat, on peut également considérer que :

Pour garantir équivalence entre ces multiplications et les décalages, le bit qui est entré dans le mot binaire est toujours un zéro, sauf si la variable est négative.

Comme en général, les décalages ne sont utilisés que sur des unsigned, retenez que dans ce cas, ce sont toujours des zéros qui sont insérés.

Exercice

Complétez le programme suivant afin de procéder à deux opérations :

Les résultats seront respectivement affectés aux variables decal et mult.

#include <stdio.h>

int main(void) {
    unsigned char a=0x12;
    unsigned char mult, decal;

    // decal = a décalé de 3 bits vers la gauche
    // COMPLETER ICI

    // mult = a multiplié par 8
    // COMPLETER ICI

    // Affiche les résultats
    printf ("a << 3 = %d\n", decal);
    printf ("a * 8 = %d\n", mult);

    return 0;
}

Quiz

Qu'affiche le programme suivant ?

unsigned char a=3;
printf ("%d", a << 1 );
Vérifier Bravo ! $$ (0000\:0011)_2 << 1 = (0000\:0110)_2 = (6)_{10} $$ Essaie encore ...

Qu'affiche le programme suivant ?

unsigned char a=3;
printf ("%d", a >> 1 );
Vérifier Bravo ! $$ (0000\:0011)_2 >> 1 = (0000\:0001)_2 = (1)_{10} $$ Essaie encore ...

Qu'affiche le programme suivant ?

unsigned char a=0x0F;
printf ("%d", a << 4 );
Vérifier Bravo ! $$ (0000\:1111)_2 << 1 = (1111\:0000)_2 = (240)_{10} $$ Essaie encore ...

Qu'affiche le programme suivant ?

unsigned char a=0x0F;
printf ("%d", a >> 4 );
Vérifier Bravo ! $$ (0000\:1111)_2 >> 1 = (0000\:0000)_2 = (0)_{10} $$ Essaie encore ...

Sans convertir en binaire, trouvez ce qu'affiche le programme suivant.

unsigned char a=1;
printf ("%d", a << 5 );
Vérifier Bravo ! Le décalage est aussi une multiplication. Le résultat est donc \( a \times 2^{5} = a \times 32 \) Essaie encore ...

Sans convertir en binaire, trouvez ce qu'affiche le programme suivant.

unsigned char a=26;
printf ("%d", a >> 2 );
Vérifier Bravo ! Le décalage est aussi une division. Le résultat est donc \( \dfrac {a} {2^{2}} = 6 \) car on ne conserve que la partie entière. Essaie encore ...

Sans convertir en binaire, trouvez ce qu'affiche le programme suivant.

unsigned int a=0xA4D912AB;
printf ("%X", a << 4 );
Vérifier Bravo ! En hexadécimal, chaque symbole est codé sur 4 bits. Comme on décale de 4 bits, on décale d'un symbole. Essaie encore ...

Voir aussi


Dernière mise à jour : 21/11/2022