Я полагаю, вы имеете в виду
, как видно на обложке книги Восторг Хакера , где символ означает слева- вращение не влево- смещение , что приведет к неправильным результатам и отрицательным голосам.
Этот метод работает, поскольку вращение вызовет все двоичные цифры x , чтобы появиться во всех возможных битах во всех терминах, и из-за дополнения 2.
Возьмите более простой пример.Рассмотрим числа только с 4 двоичными цифрами, где цифры могут быть представлены как ABCD
, тогда суммирование означает:
ABCD // x <<rot 0
+ BCDA // x <<rot 1
+ CDAB // x <<rot 2
+ DABC // x <<rot 3
Заметим, что в каждом столбце есть все A, B, C, D. Теперь, ABCD
фактически означает «2³ A + 2² B + 2¹ C + 2⁰ D», поэтому сумма равна:
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)
(A + B + C + D) - это число населения x и (2³ + 2² + 2¹ + 2⁰) = 0b1111 равно -1 в дополнении к 2, поэтому суммирование является отрицательным числом подсчета населения.
Аргумент может быть легко расширен до32-разрядные числа.