Существует множество алгоритмов для подсчета установленных бит; но я думаю, что лучший из них самый быстрый! Вы можете увидеть подробную информацию на этой странице:
Я предлагаю этот вариант:
Счетные биты, установленные в 14 , 24 или 32-битные слова с использованием 64-битных команд
unsigned int v; // count the number of bits set in v
unsigned int c; // c accumulates the total bits set in v
// option 1, for at most 14-bit values in v:
c = (v * 0x200040008001ULL & 0x111111111111111ULL) % 0xf;
// option 2, for at most 24-bit values in v:
c = ((v & 0xfff) * 0x1001001001001ULL & 0x84210842108421ULL) % 0x1f;
c += (((v & 0xfff000) >> 12) * 0x1001001001001ULL & 0x84210842108421ULL)
% 0x1f;
// option 3, for at most 32-bit values in v:
c = ((v & 0xfff) * 0x1001001001001ULL & 0x84210842108421ULL) % 0x1f;
c += (((v & 0xfff000) >> 12) * 0x1001001001001ULL & 0x84210842108421ULL) %
0x1f;
c += ((v >> 24) * 0x1001001001001ULL & 0x84210842108421ULL) % 0x1f;
Для этого метода требуется 64-разрядный процессор с быстрым модулем. Первый вариант принимает только 3 операции; второй вариант занимает 10; и третий вариант занимает 15.