Tous les articles

Opérations bit à bit : comment fonctionnent AND, OR et XOR au niveau des bits

L'en-tête d'un paquet TCP transporte plusieurs indicateurs de contrôle — SYN, ACK, FIN, et d'autres — tous compressés dans un seul octet, chaque indicateur n'occupant qu'un bit. Vérifier si le drapeau SYN est actif ne demande qu'un simple AND entre cet octet et un masque approprié : un exemple très concret d'opérations bit à bit à l'œuvre dans n'importe quel outil d'analyse réseau.

AND, OR, XOR, NOT — les quatre opérations de base

  • AND (&) — le bit résultant vaut 1 uniquement si les deux bits d'entrée valent 1. Sert à vérifier si un indicateur précis est actif dans un ensemble de drapeaux.
  • OR (|) — le bit résultant vaut 1 si au moins un des bits d'entrée vaut 1. Sert à combiner plusieurs indicateurs en une seule valeur.
  • XOR (^) — le bit résultant vaut 1 si les bits d'entrée diffèrent ; appliquer XOR deux fois avec la même valeur redonne l'original.
  • NOT (~) — inverse chaque bit d'un nombre.

En quoi le AND bit à bit diffère du AND logique

Le AND logique (&& dans la plupart des langages) travaille sur des valeurs booléennes entières et renvoie true/false, tandis que le AND bit à bit (&) traite chaque bit de deux nombres séparément et renvoie un nombre. Confondre les deux est une cause fréquente de bugs, d'autant que dans certains langages les deux compilent sans aucune erreur de type.

Pourquoi cet outil va de pair avec le convertisseur de bases

Un masque d'indicateurs égal à 18 en décimal ne dit rien au premier coup d'œil, mais la même valeur écrite 0b10010 montre immédiatement quels bits précis sont activés. C'est pourquoi les opérations bit à bit se raisonnent presque toujours en binaire ou en hexadécimal, jamais en décimal — le convertisseur de bases est généralement l'étape préalable avant que AND/OR/XOR aient un sens visuel.

Pourquoi c'est utile

  • Stocker et vérifier efficacement un ensemble d'indicateurs booléens dans un seul nombre.
  • Comprendre du code bas niveau travaillant avec des protocoles réseau ou des formats binaires.
  • Optimiser des calculs où les opérations bit à bit sont plus rapides que l'arithmétique classique.

Le piège de la priorité des opérateurs

Dans la plupart des langages de programmation, les opérateurs bit à bit & et | ont une priorité inférieure aux opérateurs de comparaison — ainsi une expression comme if (a & b == c) est en réalité évaluée comme a & (b == c), et non comme l'auteur s'y attend. C'est l'une des causes les plus courantes de bugs difficiles à repérer lors du travail avec des masques de bits, et le moyen le plus sûr de l'éviter est de toujours entourer explicitement les opérations bit à bit de parenthèses.

Essayer l'outil