À quoi servent les opérations sur les bits

Les opérations bit à bit agissent sur chaque chiffre binaire séparément. AND ne garde à 1 que les bits qui valent 1 dans les deux nombres, OR ceux qui valent 1 dans au moins un, XOR ceux qui diffèrent, NOT les inverse tous. Ce sont les instructions les plus élémentaires d'un processeur, et les plus rapides.

On s'en sert pour lire et positionner des indicateurs dans un entier, appliquer des masques comme les masques réseau, gérer les droits des fichiers Unix, les couleurs codées dans un entier, les sommes de contrôle et la cryptographie. Un AND avec 0x0F garde les quatre bits bas ; un OR avec 0x80 allume le bit de poids fort.

Décaler à gauche de n positions multiplie par 2^n, décaler à droite divise. Avec les négatifs compte la différence entre le décalage logique, qui insère des zéros, et l'arithmétique, qui recopie le bit de signe : -16 >> 2 donne -4, alors que le logique donne un grand positif.

Erreurs fréquentes

  • Oublier la largeur du mot : NOT 0 vaut 255 sur 8 bits mais 4294967295 sur 32.
  • Utiliser le décalage logique sur un nombre signé en attendant une division : les négatifs demandent l'arithmétique.
  • En JavaScript, utiliser & et | sur des nombres de plus de 32 bits : ils sont tronqués sans prévenir. Il faut BigInt pour 64 bits.

Questions fréquentes

Quelle différence entre >> et >>> ?

Tous deux décalent à droite. >> est arithmétique et recopie le bit de signe, donc les négatifs restent négatifs ; >>> est logique et insère des zéros, en traitant le nombre comme non signé.

À quoi sert XOR ?

À échanger ou comparer des bits : A XOR B indique quels bits diffèrent, A XOR A vaut 0 et A XOR B XOR B redonne A. C'est pourquoi il est à la base des sommes de contrôle, de la parité et de nombreux chiffrements.

Comment vérifier si un bit est à 1 ?

Avec un AND entre le nombre et un masque où seul ce bit vaut 1 : si le résultat n'est pas nul, le bit est à 1. Le bit k a pour masque 1 << k.

Comment fonctionne ce calcul

Chaque opération agit sur les bits de même position : AND = 1 si les deux valent 1, OR = 1 si au moins un vaut 1, XOR = 1 s'ils diffèrent, NOT inverse. A << n = A · 2^n tronqué à la largeur w ; A >>> n = ⌊A / 2^n⌋ non signé ; A >> n divise en conservant le signe. La rotation à gauche de n est (A << n) OR (A >>> (w − n)). La valeur signée est la valeur non signée moins 2^w quand le bit de poids fort vaut 1.