Les opérations de bas niveau sur les bits (bitwise operations) permettent de manipuler directement les bits d’un nombre.
C’est l’un des outils les plus rapides et les plus puissants pour les programmeurs systèmes, embarqués, graphiques ou cryptographie.Les 6 opérations principales :& → AND (et logique)
| → OR (ou inclusif)
^ → XOR (ou exclusif)
~ → NOT (complément bit à bit)
<< → Décalage à gauche → Décalage à droite
Exemple simple avec deux octets :A = 10110110 (178)
B = 01101101 (109)A & B = 00100100 → 36
A | B = 11111111 → 255
A ^ B = 11011011 → 219
~A = 01001001 (sur 8 bits) → 73Les opérations les plus utiles avec les masques :Mettre un bit à 1 :
x |= (1 << n)Mettre un bit à 0 :
x &= ~(1 << n)Inverser un bit (toggle) :
x ^= (1 << n)Tester si le bit n est à 1 :
if (x & (1 << n)) { ... }Extraire les 5 bits à partir de la position 3 :
chunk = (x >> 3) & 0b11111Quelques astuces classiques très utilisées :// Échanger deux variables sans temporaire
a ^= b;
b ^= a;
a ^= b;// Valeur absolue sans branchement (pour int32)
abs = (x ^ (x >> 31)) - (x >> 31);// Arrondir à la puissance de 2 supérieure suivante
x--;
x |= x >> 1;
x |= x >> 2;
x |= x >> 4;
x |= x >> 8;
x |= x >> 16;
x++;// Compter les bits à 1 (popcount 32 bits, version rapide)
x = (x & 0x55555555) + ((x >> 1) & 0x55555555);
x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
x = (x & 0x0F0F0F0F) + ((x >> 4) & 0x0F0F0F0F);
x = (x & 0x00FF00FF) + ((x >> 8) & 0x00FF00FF);
pop = (x * 0x01010101) >> 24;Domaines où on utilise beaucoup les bits :Graphismes → masquage alpha, packing de couleurs, swizzling
Réseau → extraction des champs d’en-tête, checksum
Cryptographie → XOR pour les chiffrements de flux, rotations
Compression → Huffman, bit-packing, codage entropique
Microcontrôleurs → configuration registres, flags atomiques
Jeux → optimisation collision, fast flags, bitboards (échecs)Les opérations bitwise sont le langage le plus proche du processeur.
Une fois qu’on maîtrise bien les masques et les décalages, on gagne énormément en vitesse et en mémoire.Bon bit-twiddling !