Je crois que vous dire
comme on le voit dans la couverture du livre Hacker's Delight, où le symbole signifie rotation gauche pas gauche changement qui produira des résultats erronés et downvotes.
Cette méthode fonctionne parce que la rotation entraînera l'apparition de tous les chiffres binaires de x dans tous les bits possibles dans tous les termes et en raison du complément de 2.
Prenez un exemple plus simple. Tenez compte des nombres avec seulement 4 chiffres binaires, où les chiffres peuvent être représentés comme ABCD
, le moyen de sommation:
ABCD // x <<rot 0
+ BCDA // x <<rot 1
+ CDAB // x <<rot 2
+ DABC // x <<rot 3
Nous notons que chaque colonne a tous A, B, C, D. Maintenant, ABCD
en fait des moyens "2³ A + 2² B + 2¹ C + 2⁰ D", de sorte que la somme est juste:
2³ A + 2² B + 2¹ C + 2⁰ D
+ 2³ B + 2² C + 2¹ D + 2⁰ A
+ 2³ C + 2² D + 2¹ A + 2⁰ B
+ 2³ D + 2² A + 2¹ B + 2⁰ C
——————————————————————————————————————————————————————
= 2³(A+B+C+D) + 2²(B+C+D+A) + 2¹(C+D+A+B) + 2⁰(D+A+B+C)
= (2³ + 2² + 2¹ + 2⁰) × (A + B + C + D)
la (A + B + C + D) est la population d'x et (2³ + 2² + 2¹ + 2⁰) = 0b1111 est -1 dans le complément de 2, donc la sommation est le négatif du nombre de population.
L'argument peut facilement être étendu à des nombres de 32 bits.
Cette méthode ne fonctionne pas. Si vous pensez que cela fonctionne, écrivez-le dans le code et testez-le. – interjay
Visitez ce site: http://graphics.stanford.edu/~seander/bithacks.html Il explique toutes les opérations dont vous avez besoin. – linello
Etes-vous sûr de l'avoir? Si je comprends votre notation, alors mettre 'x = 8' (par exemple) donne une somme de binaire 11111111 11111111 11111111 11111000, donc -sum est binaire 00 ... 001000 = décimal 8. Mais quand j'ai compté les bits à la main, J'ai eu la réponse 1. – TonyK