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. Cette page explique comment réaliser correctement le test d'un bit isolé du reste d'un mot binaire.
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 :
0
dans le masque => tous les bits à inhiber ;1
dans le masque => le bit à tester.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 :
0x80
est la proposition logique VRAI ; 0
est la proposition logique FAUSSE.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
// ...
}
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
É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
Comment procéder pour tester un bit indépendamment des autres ?
Quels tests seront vrais si le troisième bit de poids fort de reg
est à 1 ?
if ( reg & 0x20 == 1)
if ( reg & 0x20 == 0x20)
if ( reg & 0x20 != 0)
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 ?
if ( reg & 0x20 )
if ( reg & 0x20 == 0)
if ( reg & 0x20 == 0x20)
if ( !(reg & 0x20) )
Quelles boucles attendent que le bit de poids faible de reg
passe à 0 ?
while (reg & 0x01);
while !(reg & 0x01);
while (reg & 0x01 == 0);
while (reg & 0x01 != 0);