L'addition, la soustraction, la multiplication et la division fonctionnent aussi dans le système binaire. Leur logique est celle de l'arithmétique décimale : on aligne les positions de même poids, on travaille de droite à gauche lorsque c'est nécessaire et on gère retenues, emprunts et résultats partiels. La différence est que la base 2 ne possède que les chiffres 0 et 1.

Le NIST définit le bit comme un chiffre binaire valant 0 ou 1. Dans une suite ordonnée, le bit de poids fort se trouve à gauche et le bit de poids faible à droite. Chaque colonne a un poids deux fois supérieur à celle située immédiatement à sa droite.

Première règle : aligner les positions

La colonne 2⁰ doit être sous 2⁰, 2¹ sous 2¹, etc. C'est l'équivalent de l'alignement des unités, dizaines et centaines en base 10.

Les zéros initiaux ne changent pas la valeur d'un entier non signé. 1101 et 01101 représentent tous deux 13. Ils servent à visualiser l'alignement ou une largeur fixe.

Infographie présentant l'addition, la soustraction, la multiplication et la division en binaire Les quatre opérations suivent la logique décimale, mais chaque colonne n'emploie que 0 et 1 et correspond à une puissance de 2.

Addition binaire : les cas fondamentaux

  • 0 + 0 = 0 ;
  • 0 + 1 = 1 ;
  • 1 + 0 = 1 ;
  • 1 + 1 = 10₂ : écrire 0 et retenir 1 ;
  • 1 + 1 + 1 = 11₂ : écrire 1 et retenir 1.

La valeur de 1 + 1 est bien deux, mais la base 2 ne possède pas de chiffre unique 2. Elle écrit cette valeur avec une unité dans la colonne suivante et zéro dans la colonne actuelle.

Exemple complet : 1011 + 1101

1011 + 1101 ------- 11000
  • 1 + 1 = 10 : écrire 0, retenir 1 ;
  • 1 + 0 + retenue = 10 ;
  • 0 + 1 + retenue = 10 ;
  • 1 + 1 + retenue = 11 : écrire 1 et placer la dernière retenue à gauche.

Le résultat est 11000₂. En décimal, 11 + 13 = 24.

Addition binaire pas à pas de 1011 et 1101 avec les retenues Lorsqu'une colonne vaut 2 ou 3 en décimal, l'écriture binaire produit un chiffre courant et une retenue vers la gauche.

Où va la retenue ?

Elle va toujours dans la colonne immédiatement à gauche, car celle-ci vaut deux fois plus. Deux unités de 2⁰ s'écrivent 0 × 2⁰ + 1 × 2¹. Le nouveau 1 doit être ajouté à la colonne 2¹.

Une retenue finale devient un nouveau chiffre de gauche lorsque la largeur n'est pas limitée.

Schéma montrant le déplacement de la retenue dans l'addition binaire Chaque retenue se place au-dessus de la colonne suivante à gauche ; la dernière devient un nouveau chiffre.

Soustraction binaire : l'emprunt vaut 10₂

  • 0 - 0 = 0 ;
  • 1 - 0 = 1 ;
  • 1 - 1 = 0 ;
  • 0 - 1 nécessite un emprunt à gauche.

En base 10, une unité empruntée à la colonne suivante vaut dix unités courantes. En base 2, elle en vaut deux. L'emprunt est donc 10₂, et 10₂ - 1₂ = 1₂.

Exemple : 1101 - 0110

1101 - 0110 ------- 0111

Le résultat 111₂ vaut 7. Vérification : 13 - 6 = 7.

Si le bit de gauche est 0, l'emprunt se propage jusqu'au premier 1 disponible, comme dans une soustraction décimale traversant plusieurs zéros.

Soustraire en ajoutant le complément à deux

À largeur fixe, le matériel peut réutiliser l'additionneur :

A - B = A + complément_à_deux(B)

On inverse les bits puis on ajoute 1. Sur quatre bits, le complément à deux de 0110 est 1010 :

1101 + 1010 ------- 1 0111

En supprimant la retenue extérieure, il reste 0111, soit 7.

Multiplication binaire : produits partiels et décalages

  • 0 × 0 = 0 ;
  • 0 × 1 = 0 ;
  • 1 × 0 = 0 ;
  • 1 × 1 = 1.

Chaque chiffre du multiplicateur produit une ligne partielle. Un 0 donne des zéros ; un 1 recopie le multiplicande. Chaque nouvelle position décale la ligne vers la gauche.

Exemple : 101 × 11

101 × 11 ----- 101 + 1010 ----- 1111

101₂ vaut 5, 11₂ vaut 3 et 1111₂ vaut 15.

Un décalage à gauche multiplie un entier non signé par 2 si la largeur suffit. À largeur fixe, les bits sortant à gauche sont perdus et peuvent provoquer un dépassement.

Division binaire : comparer, soustraire et conserver le reste

On compare le diviseur à la partie courante du dividende. S'il entre, on écrit 1 dans le quotient et on soustrait ; sinon on écrit 0. Puis on abaisse le chiffre suivant.

Exemple simple : 1100 ÷ 10

1100₂ vaut 12 et 10₂ vaut 2. Le quotient est 110₂, soit 6, avec un reste nul.

Pour un entier positif non signé, diviser par 10₂ correspond à un décalage à droite. Le bit éliminé à droite est le reste de la division par 2.

Exemple avec reste : 10111 ÷ 11

10111₂ ÷ 11₂ = 111₂ avec reste 10₂.

En décimal : 23 = 3 × 7 + 2. Le reste est bien inférieur au diviseur.

Décalages et puissances de 2

  • un décalage à gauche multiplie par 2 ;
  • deux décalages multiplient par 4 ;
  • un décalage à droite divise entièrement un nombre non négatif par 2 ;
  • k décalages correspondent à 2ᵏ.

Pour les nombres signés, il faut distinguer décalage logique et décalage arithmétique. Le comportement précis dépend du processeur et du langage.

Largeur fixe, retenue et dépassement

Sur quatre bits non signés :

1111 + 0001 ------- 1 0000

Le résultat mathématique 16 ne tient pas dans l'intervalle 0 à 15. En conservant quatre bits, il reste 0000 et la retenue extérieure signale le dépassement.

La retenue non signée et le dépassement signé sont différents. En complément à deux sur quatre bits :

0111 (+7) + 0001 (+1) ------- 1000

1000 vaut -8 alors que le résultat attendu est +8, impossible à représenter. Il y a donc dépassement signé sans retenue finale.

Que fait le processeur ?

Le processeur utilise des circuits logiques. Des additionneurs complets traitent les bits et les retenues ; des registres conservent les opérandes ; le contrôle sélectionne l'opération.

La documentation officielle Intel décrit ADD, ADC pour l'addition avec retenue, SUB, SBB pour la soustraction avec emprunt, ainsi que les instructions de multiplication et de division. Les indicateurs carry et overflow permettent les calculs sur plusieurs mots et la détection des dépassements.

Vérifier avec Python

a = 0b1011 b = 0b1101 print(bin(a + b)) # 0b11000 print(bin(a - 0b0110)) # 0b101 print(bin(0b101 * 0b11)) # 0b1111 q, r = divmod(0b10111, 0b11) print(bin(q), bin(r)) # 0b111 0b10

Les entiers Python ont une précision arbitraire et ne reproduisent pas automatiquement le dépassement d'un registre. Un masque comme & 0b1111 conserve quatre bits.

Erreurs fréquentes

  • Ne pas aligner à droite : on mélange des poids différents.
  • Laisser la retenue dans la même colonne : elle doit aller à gauche.
  • Oublier de diminuer la colonne prêteuse : l'emprunt la modifie.
  • Ne pas décaler les produits partiels : les positions ont des poids différents.
  • Confondre quotient et reste : le reste est inférieur au diviseur.
  • Ignorer la largeur : le résultat peut ne pas tenir dans le registre.
  • Confondre carry et overflow : ils ne signalent pas la même situation.

Questions fréquentes

Pourquoi 1 + 1 ne donne-t-il pas le chiffre 2 ?

La valeur est deux, mais la base 2 l'écrit 10.

Quand la retenue finale devient-elle un nouveau chiffre ?

Lorsque la largeur est variable. Dans un registre fixe, elle peut rester dans un indicateur carry.

Multiplier par 10₂ signifie-t-il multiplier par dix ?

Non. 10₂ vaut 2 en décimal.

Une division binaire peut-elle avoir un reste ?

Oui, exactement comme une division décimale non exacte.

Pourquoi utiliser le complément à deux ?

Il transforme la soustraction en addition et permet de réutiliser le même circuit.

Sources officielles et approfondissements