В процессорах с поддержкой SSE4 у вас есть инструкция POPCNT, которая делает это за вас.
Самый наивный алгоритм на самом деле быстрее, чем вы думали (инструкции DIV очень медленные).
mov eax, [number]
xor ecx,ecx
loop_start:
test eax,1
jnz next
inc ecx
next:
shr eax, 1
mov eax,ecx
Что касается вашего комментария о предыдущих SO-ответах, я возьму пример ответа оттуда и расскажу, как его преобразовать.
long count_bits(long n) {
unsigned int c; // c accumulates the total bits set in v
for (c = 0; n; c++)
n &= n - 1; // clear the least significant bit set
return c;
}
(Я предполагаю, что вы знаете, как определить функцию и тому подобное).
Необходим очень простой цикл, переменная счетчика (традиционно ecx - это и индекс, и счетчик) и инструкции по тестированию битов.
mov edx,n
xor ecx,ecx
loop_start:
test edx,edx
jz end
mov ebx,edx
dec ebx
and edx,ebx
inc ecx
jmp loop_start
end:
mov eax,ecx
ret
Реализация чего-то подобного алгоритму веса Хэмминга в сборке не сложна, но просто достаточно сложна, чтобы вы не хотели делать это как начальную домашнюю задачу.