Le full adder (FA) est l'élément essentiel du circuit proposé par Muller et Preparata dans [#!muller:1975!#].
Un (FA) est un additionneur 2-bit avec une retenue entrante, il est composé
essentiellement de deux half adder (HA), additionneur 2-bit sans
retenue entrante, ce dernier prend en entrée deux
bits et il sort leur somme et leur retenue. Les deux figures qui suivent
représentent respectivement un (HA) et un (FA).
Un tel circuit se comporte suivant la formule suivante:
Exemple pour
=7
![]() |
![]() |
![]() |
|
![]() |
![]() |
||
![]() |
![]() |
||
![]() |
![]() |
(1) |
avec
=
,
=
,
=
,
: la sortie et
:
la retenue.
On obtient donc le circuit suivant:
Certaines machines disposent d'instructions permettant de calculer
directement
le poids de Hamming d'un mot machine (comme les alpha evo67, les itanium...).
Pour les machines qui ne disposent pas de telles instructions, le
programmeur doit les émuler. Il existe
plusieurs méthodes pour calculer le poids de Hamming.
Pour notre programme, nous avons implémenté cinq méthodes différentes.
La complexité de l'algorithme dépend du nombre de 1 dans la séquence.
Cette méthode est nettement plus efficace vu que le nombre de boucles
à effectuer est égale au nombre de 1. Bien évidemment s'il n'y a que
des 1 dans un mot de taille
, on effectuera
boucles.
Emulation du circuit
Le circuit présenté à la figure permet de faire un
calcul parallèle en faisant correspondre chaque fil d'entrée du
circuit à un bit.
L'avantage est de calculer en parallèle le poids de Hamming de 7 mots de 32
bits, l'idée est de faire tourner le circuit seulement 32 fois pour
tous les mots.