Быстрый подсчёт количества выставленных бит - Assembler
Формулировка задачи:
Привет магистры ассеблеровских диалектов!
Нет ли на обычном CPU (типа i7) какой-то хитрой команды, что бы подсчитать кол-во выставленных бит в числе после операции XOR?
То есть я "ксорю" два значения (допустим 64-х разрядных, хотя в идеале 128-и) и хочу посмотреть мол на сколько битов они различаются, то есть хочу подсчитать кол-во выставленных бит (то есть разных бит) в этих числах, ну то есть решение должно быть типа того:
0100
XOR
0101
как-то быстро подсчитать, что здесь 1 различающийся бит. Нет случаем какой-то секретной инструкции специально для этого, что бы считать это очень быстро? (сделать это не быстро существует тонна с горкой методов)
POPCNT - оно?
P.S.: а на современных GPU есть что-то? (CUDA/OpenCL)
Решение задачи: «Быстрый подсчёт количества выставленных бит»
textual
Листинг программы
int deg_of_2(uint x) { return (x =! 0) ? 0 : (x & (x-1)) == 0; }
Объяснение кода листинга программы
Интересный факт: данная функция является достаточно универсальной и может использоваться для определения степени двойки любого числа, а не только для числа 2. Вот список элементов функции:
- Входной параметр:
x
— число, для которого необходимо определить степень двойки. - Условие:
(x =! 0)
— проверка на то, что числоx
не равно нулю. - Значение переменной:
0
— результат работы функции в случае, если числоx
равно нулю. - Значение переменной:
(x & (x-1))
— результат вычисления по модулю 2, который является двоичным представлением числаx
. - Условие:
(x & (x-1)) == 0
— проверка на то, что результат вычисления по модулю 2 равен нулю. - Результат работы функции:
(x =! 0) ? 0 : (x & (x-1)) == 0
— результат выполнения функции в зависимости от значений переменныхx
и0
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д