
Systèmes de numération et opérations binaires — Guide complet
Maîtrisez les conversions de bases, masques, complément à deux, plages d’entiers et opérations sur les registres avec des exemples embarqués détaillés.
Utilisez le convertisseur de bases numériques pour reproduire les exemples. Binaire, décimal, hexadécimal et octal représentent le même entier avec différents jeux de chiffres. Le binaire décrit les états logiques et registres, l’hexadécimal compacte les octets et adresses, le décimal facilite la lecture des mesures et l’octal regroupe les bits par trois, notamment pour les permissions.
1. Bases et notation positionnelle
La base 2 utilise 0 et 1 ; la base 8, de 0 à 7 ; la base 10, de 0 à 9 ; la base 16, de 0 à 9 et de A à F, avec A = 10 et F = 15. La valeur des chiffres dᵢ en base b est N = Σ dᵢ × bⁱ, avec i = 0 à droite. Les zéros initiaux ne changent pas la valeur mais peuvent préciser la largeur d’un registre. Voici les conversions de 0 à 15.
| DEC | BIN | HEX | OCT |
|---|---|---|---|
| 0 | 0000 | 0 | 0 |
| 1 | 0001 | 1 | 1 |
| 2 | 0010 | 2 | 2 |
| 3 | 0011 | 3 | 3 |
| 4 | 0100 | 4 | 4 |
| 5 | 0101 | 5 | 5 |
| 6 | 0110 | 6 | 6 |
| 7 | 0111 | 7 | 7 |
| 8 | 1000 | 8 | 10 |
| 9 | 1001 | 9 | 11 |
| 10 | 1010 | A | 12 |
| 11 | 1011 | B | 13 |
| 12 | 1100 | C | 14 |
| 13 | 1101 | D | 15 |
| 14 | 1110 | E | 16 |
| 15 | 1111 | F | 17 |
2. Conversions étape par étape
Binaire vers décimal. Additionnez les puissances de deux : 10101010₂ = 1×128 + 0×64 + 1×32 + 0×16 + 1×8 + 0×4 + 1×2 + 0×1 = 170₁₀.
Décimal vers binaire. Divisez successivement par 2 et relevez les restes. Pour 13 : 13 = 2×6+1 ; 6 = 2×3+0 ; 3 = 2×1+1 ; 1 = 2×0+1. Lus de bas en haut, les restes donnent 1101₂. Pour 255 : 11111111₂ = FF₁₆ = 377₈.
Binaire vers hexadécimal. Regroupez par quatre depuis la droite et complétez uniquement à gauche : 1010 1011 1100 1101₂ = ABCD₁₆. Un chiffre hexadécimal correspond exactement à quatre bits car 16 = 2⁴.
Hexadécimal vers binaire. Remplacez chaque chiffre par quatre bits : 0x2F → 0010 1111₂ → 47₁₀. Les lettres majuscules ou minuscules ont la même valeur.
Octal. Regroupez par trois depuis la droite, car 8 = 2³ : 11111111₂ → 011 111 111₂ = 377₈. Inversement, 17₈ → 001 111₂ = 15₁₀. En notation positionnelle : 377₈ = 3×8² + 7×8 + 7 = 255. Du décimal vers l’octal, utilisez des divisions successives par 8.
3. Arithmétique et entiers exacts
Les bases ne changent pas les opérations : 0x0F + 0b1 = 16, 20 − 7 = 13, 0o7 × 0x3 = 21. En binaire, une retenue apparaît lorsque la somme d’une colonne atteint deux : 0111 + 0001 = 1000.
L’outil conserve les entiers en BigInt, même au-delà de 2⁵³ − 1. La division entière tronque vers zéro : −7 ÷ 3 = −2. L’opérateur % fournit un reste, et non un modulo euclidien toujours positif : −7 % 3 = −1. Pour b non nul, a = (a / b) × b + (a % b). Diviser ou calculer un reste par zéro est une erreur.
4. AND, OR, XOR et NOT
Chaque colonne est traitée indépendamment. AND conserve les bits à 1 dans les deux entrées ; OR ceux présents dans au moins une entrée ; XOR ceux qui diffèrent ; NOT inverse les bits sur la largeur choisie.
| A | B | A AND B | A OR B | A XOR B | NOT A |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 | 0 |
| 1 | 1 | 1 | 1 | 0 | 0 |
Sur huit bits : 11111111 & 00001111 = 00001111, soit 15 ; 10100000 | 00001111 = 10101111, soit 175 ; 10101010 ^ 11111111 = 01010101, soit 85. NOT appliqué à 00001111 non signé donne 11110000, soit 240. En Auto, sans masque fini, ~15 = −16 car ~x = −x − 1.
5. Entiers signés et complément à deux
Un motif non signé sur w bits représente Σ bᵢ2ⁱ, entre 0 et 2ʷ−1. En complément à deux, le bit de poids fort a le poids négatif −2ʷ⁻¹ et la plage est −2ʷ⁻¹ … 2ʷ⁻¹−1. Lorsque ce bit vaut 1, soustrayez 2ʷ à l’interprétation non signée.
Sur huit bits, FF = 255 − 256 = −1 et 80 = 128 − 256 = −128. Pour encoder −5 : partez de 00000101, inversez les bits pour obtenir 11111010 puis ajoutez 1 : 11111011, soit FB. Sur seize bits, FFFF représente −1. Le complément à deux est une représentation binaire dépendant de la largeur, et non une autre base.
| Bits | Non signé | Signé |
|---|---|---|
| 8 | 0 … 255 | −128 … 127 |
| 16 | 0 … 65535 | −32768 … 32767 |
| 32 | 0 … 4294967295 | −2147483648 … 2147483647 |
| 64 | 0 … 18446744073709551615 | −9223372036854775808 … 9223372036854775807 |
DEC désigne une valeur mathématique. En largeur fixe, BIN/HEX/OCT non négatifs désignent des motifs : HEX FF signé sur 8 bits donne DEC −1, tandis que DEC 255 est rejeté. Les saisies négatives sont des valeurs mathématiques et doivent tenir dans la plage. Aucune entrée n’est tronquée silencieusement. Les sorties non décimales sont complétées par des zéros ; le premier chiffre octal peut comporter jusqu’à deux bits inutilisés.
Auto n’impose aucune largeur ni plage non signée. Un entier négatif y reste autorisé, avec signe moins et valeur absolue plutôt qu’un mot fini en complément à deux. La vue limite l’affichage aux 128 bits de poids faible de cette valeur absolue ; conversions et copies conservent l’entier complet.
6. Décalages et dépassements
Le décalage à gauche de k bits multiplie par 2ᵏ en précision illimitée : 0x01 << 4 = 0x10 = 16. En largeur fixe, le résultat binaire est masqué par 2ʷ−1. Sur huit bits non signés, 0x80 << 1 donne exactement 256 mais le résultat stocké vaut 0, avec avertissement. En signé, 0x40 << 1 donne −128 avec avertissement car le résultat exact 128 dépasse la plage.
Le décalage logique à droite insère des zéros : FF >> 1 = 7F = 127 non signé sur 8 bits. Le décalage arithmétique propage le signe : FF >> 1 = FF = −1 et 80 >> 1 = C0 = −64 en signé. Pour les négatifs, il arrondit vers moins l’infini : −3 >> 1 = −2, contrairement à −3 / 2 = −1.
B est toujours un nombre décimal de bits, indépendant de sa base précédente et de la largeur. La limite 0–65536 borne le travail par calcul ; le nombre de décalages n’est pas réduit modulo 32 ou modulo la largeur. Décaler un entier non signé 8 bits à droite de 8 positions donne 0. Un dépassement arithmétique, tel que 255 + 1 non signé sur 8 bits ou −128 / −1 signé, est rejeté avec son résultat DEC exact. En Auto, les opérations suivent la sémantique signée illimitée de BigInt.
7. Registres STM32, masques et flags
Sur STM32F407, le registre d’entrée GPIO expose les états des broches. Après configuration de l’horloge et du périphérique, l’en-tête CMSIS permet cet accès illustratif :
uint32_t snapshot = GPIOA->IDR;
uint32_t pin5 = (snapshot >> 5u) & 1u;
uint32_t field = (snapshot >> 4u) & 0x0Fu;
GPIOA->BSRR = 1u << 5u;
Si la capture vaut 0xB0, pin5 vaut 1 et les bits 7:4 donnent 0xB = 11. L’écriture BSRR positionne le bit de sortie 5 sans lecture-modification-écriture logicielle de ODR ; le mode de la broche détermine encore le comportement externe. Vérifiez le manuel du composant pour l’horloge, les bits réservés et les champs effacés en écrivant 1. Une capture unique évite des lectures successives de valeurs différentes.
Ces opérations de flags concernent une variable locale non signée :
uint32_t flags = 0u;
uint32_t mask = 1u << 3u;
flags |= mask;
flags &= ~mask;
flags ^= mask;
uint32_t active = (flags & mask) != 0u;
Le masque 0x08 sélectionne le bit 3. OR le positionne, AND avec le complément l’efface, XOR l’inverse et l’expression finale le teste. Une lecture-modification-écriture n’est pas automatiquement atomique sur mémoire partagée ou registre matériel : utilisez le mécanisme documenté ou une synchronisation adaptée.
8. CAN, UART, SPI, ADC et FPGA
Avec les octets 0x12 et 0x34, un champ défini en grand-boutiste vaut (0x12 << 8) | 0x34 = 0x1234 = 4660 ; l’interprétation petit-boutiste donne 0x3412 = 13330. Les champs CAN suivent la spécification de message ou le DBC. Le cadrage UART et l’ordre des bits SPI ne fixent pas à eux seuls l’ordre des octets d’une valeur applicative. Consultez les guides UART et SPI.
Pour un ADC non signé 12 bits, 0xABC = 2748 appartient à 0–4095. Une approximation d’affichage reliant les extrémités avec Vref = 3,3 V donne 2748 × 3,3 / 4095 ≈ 2,2145 V. Ce n’est pas la loi de quantification exacte : le pas idéal vaut 3,3/4096 V et le transfert réel dépend du composant. Un ADC signé peut utiliser le complément à deux ou le binaire décalé. Vérifiez codage et alignement puis utilisez le calculateur ADC/DAC.
En FPGA et microcontrôleur, déclarez explicitement largeur et signe. En SystemVerilog, 8'hFF est un motif non signé sur 8 bits et 8'shFF représente −1 signé. Les littéraux sans taille et les règles de promotion peuvent changer un résultat. Les masques de ce calculateur ne reproduisent pas toutes les règles de C/C++ ou des HDL.
9. Questions fréquentes
Comment convertir le binaire en hexadécimal ?
Regroupez les bits par quatre depuis la droite puis remplacez chaque groupe par 0–F. Ainsi, 1111 0000 devient F0. Complétez le groupe de gauche par des zéros si nécessaire.
Quelle différence entre entiers signés et non signés ?
Le non signé utilise tous les bits pour une valeur positive ou nulle. Le complément à deux attribue un poids négatif au bit de poids fort. Sur huit bits, FF vaut 255 non signé ou −1 signé.
Comment fonctionne le complément à deux ?
Sur w bits, encodez un négatif en ajoutant sa valeur à 2ʷ. Cela revient à inverser les bits de sa valeur absolue puis à ajouter un, dans la largeur choisie.
Qu’est-ce qu’une opération XOR bit à bit ?
XOR produit 1 lorsque les bits d’entrée diffèrent. Appliqué avec un masque, il inverse exactement les positions sélectionnées : AA XOR FF donne 55.
Comment extraire des bits d’un registre ?
Décalez le champ vers la droite puis appliquez un masque correspondant à sa largeur. Pour les bits 7:4 : (reg >> 4) & 0x0F. Respectez les effets des lectures du registre.
Pourquoi FF représente-t-il parfois −1 ?
L’interprétation dépend de la largeur : le bit de signe est actif pour FF sur huit bits, donnant −1. Sur seize bits, 00FF représente +255.