Comment les ordinateurs effectuent-ils les opérations de multiplication & division en interne par des approches additives ?


Pour la multiplication au niveau du bit, les ordinateurs tirent avantage du fait qu'il'est très facile de multiplier par 2 en binaire.

Vous voyez, en décimal, la multiplication par 10 est facile, car c'est la base du système numérique. Si vous voulez multiplier, disons, 56 par 10, il suffit d'ajouter un zéro à la fin et vous obtenez 560.


De même, en binaire, disons que vous voulez multiplier 9, qui est 1001 exprimé en binaire par 2. Il suffit d'ajouter un zéro à la fin : La réponse est 10010.

C'est'tout beau, mais comment multiplier par un nombre qui n'est pas 2 ? Disons'que vous voulez multiplier 9 par 11, c'est-à-dire 1001 x 1011 en binaire. Notez que le fait d'écrire 11 de cette manière signifie en réalité ce qui suit :

[math](11)_{10} = (1011)_2 = 1cdot 2^3 + 0cdot 2^2 + 1cdot 2^1 + 1cdot 1^0 = 1cdot 8 + 0cdot 4 + 1cdot 2 + 1cdot 1[/math]

(Tous les nombres après le deuxième signe égal sont en décimal, au cas où cela ne serait&apos ;pas clair)

Ce qui signifie donc (par le lavis distributif) :

[math]9cdot 11 = 9cdot (8 + 2 + 1) = 9cdot 8 + 9cdot 2 + 9cdot 1[/math]

(Cette fois, tout'est en décimal). Donc, si seulement nous pouvons trouver les trois termes du côté droit et les additionner, nous'sommes faits. Il s'avère, que toutes ces multiplications reviennent simplement à ajouter des zéros en binaire :

[maths](1001)_2 cdot 1 = (1001)_2[/math]

[maths](1001)_2 cdot 2 = (10010)_2[/math]

[math](1001)_2 cdot 4 = (100100)_2[/math]

[math](1001)_2 cdot 8 = (1001000)_2[/math]

(J&apos ;ont inclus le cas 4 même si elle'est pas techniquement nécessaire). Maintenant, nous pouvons additionner les termes pertinents pour obtenir :

[math](1001)_2 cdot (1011)_2 = (1001000)_2 + (10010)_2 + (1001)_2 = (1100011)_2[/math]

Cela fait exactement 99 en décimal.

Cet algorithme est facile à généraliser : il suffit d'ajouter des zéros (ce qui est parfois appelé " décalage ", puisque vous'déplacez essentiellement tous les chiffres vers la gauche) et d'ajouter.

Cela peut sembler obscur de nos jours, mais j'ai en fait implémenté ceci en langage d'assemblage Commodore 64, car le processeur n'avait pas d'opération de multiplication au niveau du CPU.

Peut-être plus intéressant, j'ai été assez déconcerté quand j'ai appris plus tard (au lycée) que c'était en fait exactement la façon dont les anciens Égyptiens faisaient la multiplication. Évidemment, la notation différait, mais c'est quand même assez cool qu'ils aient inventé un algorithme aussi "moderne" à l'époque.

Pour ce qui est de la division, c'est un peu plus délicat, mais c'est fondamentalement la même chose que la division longue. Je'laisserai à quelqu'un d'autre le soin de donner un exemple.

.