Зачем выбирать один метод подсчета бит вместо другого?Ну, это действительно зависит от вашей машины и проблемы, которую вы пытаетесь решить.Обратите внимание, что все приведенные ниже количества команд относятся к базовому процессору RISC и могут плохо переводиться на более сложного зверя, такого как x86.
Алгоритм HAKMEM, который вы процитировали, будет выполнен в 13 инструкциях, но вряд ли будет оченьбыстро из-за оператора модуля.На первый взгляд, он выглядит так, как будто он имеет довольно хороший параллелизм на уровне команд, который должен помочь, если ваш процессор способен использовать это.
Алгоритм, представленный Бо Перссоном, довольно быстр (2 + 5*pop(x)
инструкции)но только если слово малонаселенное.Он также может быть изменен для работы с густонаселенными словами.Он также содержит ветви и не имеет существенного параллелизма на уровне команд.
РЕДАКТИРОВАТЬ: Метод поиска в таблице также может быть очень быстрым, но он осуществляет доступ к памяти.Если вся таблица находится в кеше L1, то это, вероятно, один из самых быстрых алгоритмов.Если таблица не находится в кеше, то она почти наверняка одна из самых медленных.
Алгоритм ниже представляет собой вариант одного из алгоритмов HAKMEM и представлен в книге Восторг хакера (Я очень рекомендую эту книгу, если вам нравятся такие вещи).Выполняется в 19 инструкциях и не имеет ответвлений.Он также не использует деление, но имеет умножение.Он также очень экономичен в том, что использует регистры, максимально используя одну и ту же маску.Здесь все еще нет существенного параллелизма на уровне команд, который я вижу.
int pop(unsigned x) {
unsigned n;
n = (x >> 1) & 0x77777777;
x = x - n;
n = (n >> 1) & 0x77777777;
x = x - n;
n = (n >> 1) & 0x77777777;
x = x - n;
x = (x + (x >> 4)) & 0x0F0F0F0F;
x = x * 0x01010101;
return x >> 24;
}
В книге Хакера «Восхищение» также представлена пара даже более специализированных алгоритмов для полей шириной 9–8–7 или использования операторов с плавающей запятой.Обратите внимание, что большая часть анализа, который я представил выше, также частично была взята из этой книги.
Дело в том, что существует множество методов грузовиков, и единственный способ убедиться, что лучше всего работает в вашей конкретной ситуации, этоизмерить и сравнить.Я понимаю, что это довольно консервативный ответ, но альтернатива - знать ваш процессор и компилятор наизнанку.