non, tes valeurs binaires sont fausses.
Dans l'exemple que tu donnes, ça donne ça :
iteration 0
carry : 1 000001
a : 25 011001
b : 37 100101
a apr : 60 111100
b apr : 2 000010
iteration 1
carry : 0 000000
a : 60 111100
b : 2 000010
a apr : 62 111110
b apr : 0 000000
La somme de 25 et 37 est 62 |
le carry = a & b , c est pour détecter les retenues 1 + 1 en binaire ca fait une retenue, alors que 0 + 0, 0 +1 et 1 + 0 non. Le 0 + 0 , on se fiche du resultat , et le 1 + 0 Et 0 +1 , ca donne 1. Donc carry contient la position des retenues
le a = a ^b, ca fait la somme seulement sur les bits sans retenue. Donc ici :
a^b = 25 ^37 = 011001 ^ 100101 , ca fait qu'on ajoute 011001 ^ 100101 mais pas 011001 ^ 100101. Par contre , la retenue a été détectée et est stockée dans carry .
Ensuite b prend la valeur de toutes les retenues décalée de 1, ici, il n'y en a qu'une, le 000001 qui se transforme en 000010 , car 000001 + 000001 ca fait 000010
Ensuite, on refait un tour de boucle et on recommence, est ce que ca génère des retenues, etc... jusqu'à ce que b vaille 0.
Voilà un autre exemple avec des nombres plus grands :
iteration 0
carry : 524 00000000001000001100
a : 524 00000000001000001100
b : 77647 00010010111101001111
a apr : 77123 00010010110101000011
b apr : 1048 00000000010000011000
iteration 1
carry : 1024 00000000010000000000
a : 77123 00010010110101000011
b : 1048 00000000010000011000
a apr : 76123 00010010100101011011
b apr : 2048 00000000100000000000
iteration 2
carry : 2048 00000000100000000000
a : 76123 00010010100101011011
b : 2048 00000000100000000000
a apr : 74075 00010010000101011011
b apr : 4096 00000001000000000000
iteration 3
carry : 0 00000000000000000000
a : 74075 00010010000101011011
b : 4096 00000001000000000000
a apr : 78171 00010011000101011011
b apr : 0 00000000000000000000
La somme de 524 et 77647 est 78171 |