Я думаю, что метод Брайана Кернигана тоже будет полезен ... Он проходит через столько итераций, сколько есть битов. Поэтому, если у нас есть 32-битное слово с набором только высоких бит, он будет проходить один раз через цикл.
int countSetBits(unsigned int n) {
unsigned int n; // count the number of bits set in n
unsigned int c; // c accumulates the total bits set in n
for (c=0;n>0;n=n&(n-1)) c++;
return c;
}
Опубликовано в 1988 году, на языке программирования C 2nd Ed. (Брайан У. Керниган и Деннис М. Ричи) упоминает об этом в упражнении 2-9. 19 апреля 2006 года Дон Кнут указал мне, что этот метод «впервые был опубликован Петром Вегнером в CACM 3 (1960), 322. (Также был обнаружен независимо Дерриком Лемером и опубликован в 1964 году в книге под редакцией Беккенбаха)».
blockquote>