Les systèmes décimal et binaire représentent les mêmes nombres avec des ensembles de chiffres différents. Le décimal utilise les dix chiffres de 0 à 9 ; le binaire n'emploie que 0 et 1. L'écriture change, mais pas la quantité : 13 en décimal et 1101 en binaire ont la même valeur.
Le NIST définit le bit comme un chiffre binaire valant 0 ou 1. Une suite ordonnée de bits peut être interprétée comme un entier non signé, mais sa signification dépend du contexte. Comprendre les conversions revient donc à comprendre la numération positionnelle, et non à apprendre une table par cœur.
Que signifie la base d'un système de numération ?
La base détermine les chiffres disponibles et le poids des positions. En base 10, les positions sont des puissances de 10 : unités, dizaines, centaines. En base 2, ce sont des puissances de 2.
De droite à gauche :
2⁰ = 1, 2¹ = 2, 2² = 4, 2³ = 8, 2⁴ = 16, ...
Le chiffre de droite est le bit de poids faible, LSB ; celui de gauche est le bit de poids fort, MSB. Le glossaire du NIST adopte cette convention : MSB à gauche, LSB à droite.
Les divisions successives par 2 produisent les chiffres binaires ; dans l'autre sens, chaque chiffre est multiplié par son poids.
Du binaire au décimal : additionner les poids
On numérote les positions à partir de 0 en commençant à droite. Chaque chiffre est multiplié par la puissance de 2 correspondante, puis les résultats sont additionnés.
Pour 1001₂ :
1 × 2³ + 0 × 2² + 0 × 2¹ + 1 × 2⁰
8 + 0 + 0 + 1 = 9
Donc 1001₂ = 9₁₀. Le zéro ne supprime pas le poids : il indique simplement que ce poids ne contribue pas à la somme.
Chaque 1 ajoute le poids de sa position ; chaque 0 ne l'ajoute pas.
Une méthode rapide de gauche à droite
On peut lire les chiffres de gauche à droite, doubler le résultat partiel et ajouter le chiffre suivant.
Pour 1101₂ :
- partir de 1 ;
- 1 × 2 + 1 = 3 ;
- 3 × 2 + 0 = 6 ;
- 6 × 2 + 1 = 13.
Déplacer une position vers la gauche en base 2 revient à multiplier par 2.
Du décimal au binaire : divisions successives par 2
Pour convertir un entier positif, on le divise plusieurs fois par 2. À chaque étape, on note le quotient entier et le reste. Le reste ne peut être que 0 ou 1.
Conversion de 13 :
- 13 ÷ 2 = 6, reste 1 ;
- 6 ÷ 2 = 3, reste 0 ;
- 3 ÷ 2 = 1, reste 1 ;
- 1 ÷ 2 = 0, reste 1.
En lisant les restes du dernier au premier, on obtient 1101₂.
Pourquoi lit-on les restes de bas en haut ?
Ce n'est pas une règle arbitraire. Chaque division vérifie :
n = 2 × quotient + reste
Le premier reste indique la présence de l'unité binaire 2⁰ : il s'agit donc du chiffre de droite. La division suivante trouve le chiffre de 2¹, puis celui de 2². Les chiffres sont découverts du moins significatif au plus significatif, alors que l'écriture normale suit l'ordre inverse.
Le premier reste correspond à 2⁰, le deuxième à 2¹ : les chiffres de droite sont découverts en premier.
Démonstration avec 9
Les divisions produisent 1, 0, 0, 1. Ces restes correspondent successivement à 2⁰, 2¹, 2² et 2³. Dans l'ordre normal des positions, on obtient 1001₂.
Le cas particulier de zéro
Si le nombre initial est 0, une boucle classique de divisions ne s'exécute pas. Sa représentation n'est pourtant pas vide : c'est 0. Un programme doit traiter explicitement ce cas.
Les zéros initiaux modifient-ils la valeur ?
Pour un entier non signé, non : 101, 0101 et 00000101 valent tous 5. Ils peuvent néanmoins indiquer une largeur fixe de 8, 16 ou 32 bits.
Un octet est une suite de huit bits. Sur huit bits non signés, les valeurs vont de 0 à 255, le maximum étant 11111111₂.
Le premier bit à gauche indique-t-il toujours le signe ?
Non. Dans une conversion scolaire ordinaire, sans indication contraire, le nombre est non signé. Ainsi 1001₂ vaut 9 et non -9 ; le premier 1 représente 2³.
L'interprétation change seulement si l'on précise une représentation signée et une largeur. Les ordinateurs modernes utilisent généralement le complément à deux. Sur quatre bits :
- 0101₂ représente +5 ;
- 1011₂ représente -5 en complément à deux.
Le bit de gauche indique une valeur négative uniquement lorsque le format signé et la largeur sont connus.
Précision sur le « bit de signe »
On appelle souvent le bit de gauche « bit de signe » pour simplifier. En complément à deux, ce n'est pas seulement un symbole moins séparé. Dans un mot de n bits, son poids est négatif, -2ⁿ⁻¹, tandis que les autres poids restent positifs.
Sur quatre bits :
1011₂ = -8 + 0 + 2 + 1 = -5
Cette lecture n'est valable que pour un entier signé en complément à deux sur quatre bits. La même suite non signée vaut 11. Le contexte et le format sont donc indispensables.
Intervalles représentables
Avec n bits non signés, l'intervalle va de 0 à 2ⁿ - 1. En complément à deux, il va de -2ⁿ⁻¹ à 2ⁿ⁻¹ - 1.
- 4 bits non signés : 0 à 15 ;
- 4 bits signés : -8 à +7 ;
- 8 bits non signés : 0 à 255 ;
- 8 bits signés : -128 à +127.
Vérifier avec Python
La méthode manuelle explique le mécanisme. La documentation officielle Python définit bin() pour produire une chaîne binaire et int(texte, 2) pour interpréter une chaîne en base 2.
bin(13) # '0b1101' int("1101", 2) # 13Le préfixe 0b indique le binaire. Attention : bin(-5) produit -0b101, une écriture textuelle avec signe moins, et non un mot de largeur fixe en complément à deux.
Erreurs fréquentes
- Commencer par la puissance 1 : la position de droite est 2⁰.
- Lire les restes dans l'ordre de découverte : le nombre est inversé.
- Oublier zéro : sa représentation est 0.
- Utiliser des poids décimaux : en binaire, les poids sont 1, 2, 4, 8, 16.
- Interpréter tout 1 initial comme négatif : il faut avoir défini un format signé.
- Confondre valeur et codage : une même suite peut avoir plusieurs sens.
Questions fréquentes
Pourquoi diviser par 2 ?
Parce que la base cible est 2. La division par la base sépare le quotient des unités de la position courante.
Peut-on utiliser uniquement les puissances de 2 ?
Oui. On soustrait la plus grande puissance possible et on place 1 dans les positions utilisées. Les divisions sont simplement plus systématiques.
Comment vérifier rapidement ?
On reconvertit en décimal en additionnant les poids. Si l'on retrouve le nombre initial, la conversion est cohérente.
La méthode fonctionne-t-elle pour les fractions ?
La partie entière utilise les divisions par 2. La partie fractionnaire utilise des multiplications successives par 2 et mérite un article distinct.