Afin de bien comprendre les opérateurs logiques bit à bit en C,
nous allons étudier ici quelques exemples. Lorque l'on souhaite simuler sur papier
le fonctionnement des opérateurs &
, |
^
et ~
, nous devons procéder en trois
étapes :
Considérons l'exemple suivant avec l'opérateur ET :
unsigned char a=197, b=227 , s;
s = a & b;
Étape 1 : convertissons a
et b
en binaire (vous trouverez un convertisseur en ligne ici ).
$$ a = (197)_{10} = (1100\:0101)_2 $$ $$ b = (227)_{10} = (1110\:0011)_2 $$
Notez que l'on convertit sur 8 bits, car l'unsigned char
est codé sur 8 bits. Si c'était un int
il faudrait convertir sur 32 bits.
Étape 2 : réalisons le ET logique entre chaque bit :
$$ \begin{array}[t]{r} 1100\:0101 \\ \& \; 1110\:0011 \\ \hline 1100\: 0001 \end{array} $$
Étape 3 : convertissons le résultat s
de la base binaire vers la base décimale :
$$ s = (1100\:0001)_2 = (193)_{10} $$
Vérifions ce résultat :
Reprenons l'exemple ci-dessous avec l'opérateur OU exclusif :
unsigned char a=197, b=227 , s;
s = a ^ b;
Étape 1 : la conversion en binaire est identique :
$$ a = (197)_{10} = (1100\:0101)_2 $$ $$ b = (227)_{10} = (1110\:0011)_2 $$
Étape 2 : réalisons le OU exclusif entre chaque bit :
$$ \begin{array}[t]{r} 1100\:0101 \\ \bigoplus \; 1110\:0011 \\ \hline 0010\: 0110 \end{array} $$
Étape 3 : convertissons le résultat s
de la base binaire vers la base décimale :
$$ s = (0010\:0110)_2 = (38)_{10} $$
Vérifions ce résultat :
Considérons l'exemple ci-dessous qui inverse bit à bit la variable a
:
unsigned char a=225, s;
s = ~a;
Étape 1 : conversion en binaire de la variable a
:
$$ a = (225)_{10} = (1110\:0001)_2 $$
Étape 2 : réalisons l'inversion de chaque bit :
$$ \begin{array}[t]{r} a &=& \; 1110\:0001 \\ \hline s = \overline{a} &=& 0001\: 1110 \end{array} $$
Étape 3 : convertissons le résultats s
de la base binaire vers la base décimale :
$$ s = (0001\:1110)_2 = (30)_{10} $$
Vérifions ce résultat :
Complétez le programme suivant afin qu'il calcule le NON-ET (NAND) bit à bit
des variables a
et b
:
#include <stdio.h>
int main(void) {
unsigned char a =125, b=89, s;
// a NAND b => s
// COMPLETER ICI
// Affiche le résultat
printf ("s = %d\n", s);
return 0;
}
Pour réaliser le quizz, vous aurez besoin d'un papier et d'un crayon afin de reproduire les étapes présentées dans les exemples de ce cours. Vous pouvez également vous aider du convertisseur binaire / décimale en ligne.
Qu'affiche le programme suivant ?
unsigned char a=3, b=5;
printf ("%d", a & b );
Qu'affiche le programme suivant ?
unsigned char a=3, b=5;
printf ("%d", a | b );
Qu'affiche le programme suivant ?
unsigned char a=3, b=5;
printf ("%d", a ^ b );
Qu'affiche le programme suivant ?
unsigned char a=0xAA, s;
s = ~a;
printf ("%u", s );
Qu'affiche le programme suivant ?
unsigned char a=3, b=5, s;
s = a ^ ~b;
printf ("%u", s );