Cours 7.5. Tester un bit

Il est fréquent qu'un programme teste le statut d'un seul bit. Le problème est alors de tester ce bit indépendamment des autres.

Masquage binaire, inversion de bits

Fonctionnement

Le principe consiste à forcer à zéro tous les bits sauf celui que l'on souhaite tester. Le forçage à zéro se fait grâce à un ET bit à bit entre le registre à modifier et un masque. Les bits du masque sont définis tels que :

Supposons que l'on souhaite tester le bits de poids fort d'un mot de 8 bits. Le masque sera :

$$ masque = (1000~0000)_2 = (80)_{16} $$

$$ \begin{array}[t]{r} b_7 & b_6 & b_5 & b_4 & \, & b_3 & b_2 & b_1 & b_0 & <= & mot \: initial \\ \& \quad 1 & 0 & 0 & 0 & \, & 0 & 0 & 0 & 0 & <= & masque \\ \hline b_7 & 0 & 0 & 0 & \, & 0 & 0 & 0 & 0 & <= & résultat \end{array} $$

En analysant le résultat de l'équation 2, on comprends facilement que le résultat ne peut prendre que deux valeurs :

Pour déterminer le status du bit, il suffit de tester le résultat du masquage.

if ( registre & 0x80 == 0x80) {
  // Le bit de poids fort est à 1
  // ...
}
else {
  // Le bit de poids fort est à 0
  // ...
}

Le résultat du masque ne peut retourner que 2 valeurs : 0x80 et 0. D'un point de vue purement logique :

Le test du code ci-dessus peut se simplifier :

if ( registre & 0x80 ) {
  // Le bit de poids fort est à 1
  // ...
}
else {
  // Le bit de poids fort est à 0
  // ...
}

Attendre un changement de bit

Dans les systèmes embarqués, il est souvent nécessaire d'attendre le changement d'état d'un bit. Par exemple, l'appui sur un bouton. Cela peut se faire sur le même principe dans une boucle :

// Attend que le deuxième bit de poids faible passe à 1
while !(PORTA & 0x02);

Sur le même principe, on peut aussi attendre un front montant :

// Attend un front montant sur le deuxième bit de poids faible
while (PORTA & 0x02);   // Attend que le bit soit à zéro
while !(PORTA & 0x02);  // Attend que le bit passe à un

Exercice

Écrire un programme qui demande à l'utilisateur de saisir un entier. Le programme affiche alors la parité du nombre saisi. Le programme doit impérativement utiliser un masquage pour tester le bit de poids faible.

unsigned int N;
printf ("Entrez un entier positif  : ");
scanf("%d", &N);

// Test le bit de poids faible 
// afin de déterminer la parité  
// COMPLETEZ ICI

Quiz

Comment procéder pour tester un bit indépendamment des autres ?

Vérifier Bravo ! Il faut isoler le bit en forçant les autres à zéro. Essaie encore ...

Quels tests seront vrais si le troisième bit de poids fort de reg est à 1 ?

Vérifier Bravo ! On souhaite tester si le résultat du masquage est égal à 0x20, on peut le faire de différentes façons. Essaie encore ...

Quels tests seront vrais si le troisième bit de poids fort de reg est à 0 ?

Vérifier Bravo ! Il suffit de tester si le résultat du masquage est égal à zéro. Essaie encore ...

Quelles boucles attendent que le bit de poids faible de reg passe à 0 ?

Vérifier Bravo ! la boucle sera exécutée tant que le bit est égal à un, c'est-à-dire que le résultat du masquage est différent de zéro. Essaie encore ...

Voir aussi


Dernière mise à jour : 18/11/2021