Il existe une opération de masquage qui permet d'inverser un ou plusieurs bits d'un mot binaire tout en préservant la valeur des autres.
L'inversion se fait grâce à un OU exclusif bit à bit entre le registre à modifier et un masque. Les bits du masque sont définis tels que :
0
dans le masque => le bit initial est conservé ;1
dans le masque => le bit est inversé.Supposons que l'on souhaite inverser les 4 bits de poids faibles d'un mot de 8 bits. Le masque sera :
$$ masque = (0000~1111)_2 = (0F)_{16} $$
$$ \begin{array}[t]{r} b_7 & b_6 & b_5 & b_4 & \, & b_3 & b_2 & b_1 & b_0 & <= & mot \: initial \\ + \quad 0 & 0 & 0 & 0 & \, & 1 & 1 & 1 & 1 & <= & masque \\ \hline b_7 & b_6 & b_5 & b_4 & \, & \overline{b_3} & \overline{b_2} & \overline{b_1} & \overline{b_0} & <= & résultat \end{array} $$
Ce principe s'appuie sur les relations suivantes de l'algèbre de Boole :
Le masque de cet exemple peut être appliqué à la variable reg
grâce à l'instruction suivante :
resultat = donnee ^ 0x0F;
Complétez le programme ci-dessous afin d'inverser le bit de poids faible de la variable reg
:
// | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 |
unsigned char reg = 0x32;
printf ("Avant : ");
affBin(reg);
// Inversez le bit de poids faible
// COMPLETEZ ICI
// Affiche le résultat
printf ("Après : ");
affBin(reg);
Complétez le programme ci-dessous afin d'inverser les 4 bits de poids fort de la variable reg
:
// | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 |
unsigned char reg = 0x32;
printf ("Avant : ");
affBin(reg);
// Inverse les 4 bits de poids forts
// COMPLETEZ ICI
// Affiche le résultat
printf ("Après : ");
affBin(reg);
Quel opérateur faut-il utiliser pour inverser certains bits ?
Dans un masquage d'inversion, les bits du masque qui sont à 1
permettent de ...
Dans un masquage d'inversion, les bits du masque qui sont à 0
permettent de ...
Que vaut reg
après ces instructions ?
reg = 0xAA;
reg ^= 0x0F;