Ou, plutôt que de Jason au niveau du bit approche, vous pouvez calculer le nombre de bits en parallèle, cela devrait fonctionner beaucoup plus rapidement avec un grand nombre. À chaque étape, figure hors du porter partie et la partie qui est somme. Vous tentez d'ajouter le porter à la somme, ce qui pourrait provoquer un risque de contamination de nouveau - d'où la boucle.
>>> def add(a, b):
while a != 0:
# v carry portion| v sum portion
a, b = ((a & b) << 1), (a ^ b)
print b, a
return b
lorsque vous ajoutez 1 et 3, les deux nombres ont le 1 ensemble de bits, de sorte que la somme de 1+1 porte. L'étape suivante, vous devez ajouter 2 à 2, et qui exerce dans la bonne somme de quatre. Qui provoque une sortie
>>> add(1,3)
2 2
4 0
4
Ou un exemple plus complexe
>>> add(45, 291)
66 270
4 332
8 328
16 320
336
Edit:
Pour travailler facilement sur des nombres signés, vous devez introduire une limite supérieure sur a et b
>>> def add(a, b):
while a != 0:
# v carry portion| v sum portion
a, b = ((a & b) << 1), (a ^ b)
a &= 0xFFFFFFFF
b &= 0xFFFFFFFF
print b, a
return b
Essayez-le sur
add(-1, 1)
pour voir d'un seul bit de transporter jusqu'à travers l'ensemble de la gamme et de dépassement de plus de 32 itérations
4294967294 2
4294967292 4
4294967288 8
...
4294901760 65536
...
2147483648 2147483648
0 0
0L