FriconiX
Des milliers de pictogrammes gratuits dessinés avec amour !

Cours 3.6. Détail des opérateurs bit à bit

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 :

  1. convertir l'(les) opérande(s) en binaire
  2. réaliser l'opération logique sur chaque bit
  3. convertir le résultat en décimal

Exemple 1

Considérons l'exemple suivant avec l'opérateur ET :

unsigned char a=197, b=99 , 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 = (0100\:0001)_2 = (193)_{10} $$

Vérifions ce résultat :

Exemple 2

Reprenons l'exemple ci-dessous avec l'opérateur OU exclusif :

unsigned char a=197, b=99 , 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 :

Exemple 3

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ésultat s de la base binaire vers la base décimale :

$$ s = (0001\:1110)_2 = (30)_{10} $$

Vérifions ce résultat :

Exercice 1

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 => s
    // COMPLETER ICI

    // Affiche le résultat
    printf ("s = %d\n", s);

    return 0;
}

Quiz

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 );
Vérifier Bravo ! $$ \begin{array}[t]{r} 0000\:0011 &=& (3)_{10} \\ \& \; 0000\:0101 &=& (5)_{10} \\ \hline 0000\: 0001 &=& (1)_{10} \end{array} $$ Essaie encore ...

Qu'affiche le programme suivant ?

unsigned char a=3, b=5;
printf ("%d", a | b );
Vérifier Bravo ! $$ \begin{array}[t]{r} 0000\:0011 &=& (3)_{10} \\ + \; 0000\:0101 &=& (5)_{10} \\ \hline 0000\: 0111 &=& (7)_{10} \end{array} $$ Essaie encore ...

Qu'affiche le programme suivant ?

unsigned char a=3, b=5;
printf ("%d", a ^ b );
Vérifier Bravo ! $$ \begin{array}[t]{r} 0000\:0011 &=& (3)_{10} \\ \bigoplus \; 0000\:0101 &=& (5)_{10} \\ \hline 0000\: 0110 &=& (6)_{10} \end{array} $$ Essaie encore ...

Qu'affiche le programme suivant ?

unsigned char a=0xAA, s;
s = ~a;
printf ("%u", s );
Vérifier Bravo ! $$ \begin{array}[t]{r} a &=& \; 1010\:1010 &=& (AA)_{16} \\ \hline s= \overline{a} &=& 0101\: 0101 &=& (85)_{10} \end{array} $$ Essaie encore ...

Qu'affiche le programme suivant ?

unsigned char a=3, b=5, s;
s = a ^ ~b;
printf ("%u", s );
Vérifier Bravo ! $$ \begin{array}[t]{r} b &=& 0000\:0101 &=& (5)_{10} \\ \hline \overline{b} &=& 1111\: 1010 &=& (250)_{10} \end{array} $$ $$ \begin{array}[t]{r} a &=& 0000\:0011 &=& (3)_{10} \\ \bigoplus \overline{b} &=& \; 1111\:1010 &=& (250)_{10} \\ \hline s &=& 1111\: 1001 &=& (249)_{10} \end{array} $$ Essaie encore ...

Voir aussi


Dernière mise à jour : 25/09/2021