En C, il existe deux opérateurs permettant le décalage des bits :
<<
est l'opérateur de décalage à gauche>>
est l'opérateur de décalage à droites = 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.
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 :
$$ (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 :
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 :
$$ (0011\:1100)_2 >> 3 = (0000\:0111)_2 = (7)_{10}$$
Vérifons ce résultat :
Un décalage binaire revient à opérer une multiplication ou une division. Lorsque l'on décale à gauche, on multiplie par deux :
a << 1
est équivalent à \( 2 \times a \)a << 2
est équivalent à \( 4 \times a \)a << 3
est équivalent à \( 8 \times a \)a << 4
est équivalent à \( 16 \times a \)a << n
est équivalent à \( 2^n \times a \)Pour les décalages à droite, si l'on omet la partie décimale du résultat, on peut également considérer que :
a >> n
est équivalent à \( \dfrac{a}{2^n} \)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.
Complétez le programme suivant afin de procéder à deux opérations :
a
;a
.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;
}
Qu'affiche le programme suivant ?
unsigned char a=3;
printf ("%d", a << 1 );
Qu'affiche le programme suivant ?
unsigned char a=3;
printf ("%d", a >> 1 );
Qu'affiche le programme suivant ?
unsigned char a=0x0F;
printf ("%d", a << 4 );
Qu'affiche le programme suivant ?
unsigned char a=0x0F;
printf ("%d", a >> 4 );
Sans convertir en binaire, trouvez ce qu'affiche le programme suivant.
unsigned char a=1;
printf ("%d", a << 5 );
Sans convertir en binaire, trouvez ce qu'affiche le programme suivant.
unsigned char a=26;
printf ("%d", a >> 2 );
Sans convertir en binaire, trouvez ce qu'affiche le programme suivant.
unsigned int a=0xA4D912AB;
printf ("%X", a << 4 );