Metoda naiwna, to zliczanie zapalonego bitu na pozycji 0 (zero) i przesuwanie wartości w prawo o jeden bit aż do momentu gdy wynikiem przesunięcia nie będzie zero:
#include <iostream>
unsigned short count_bits(unsigned value) {
unsigned short counter = 0;
while(value != 0) {
if((value & 0x01) == 1) {
++counter;
}
value >>= 1;
}
return counter;
}
int main() {
unsigned value = 127;
std::cout << "value = " << value << ", counting bits = " << count_bits(value) << '\n';
}
Bardziej skomplikowane (ale i wydajniejsze) metody, wymagają zastosowania operacji arytmetycznych i logicznych. Tylko pytanie czy aż tak bardzo tego potrzebujesz?
#include <iostream>
#include <cstdint>
unsigned short count_bits(uint32_t value) {
value = value - ((value >> 1) & 0x55555555);
value = (value & 0x33333333) + ((value >> 2) & 0x33333333);
return (((value + (value >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
}
int main() {
unsigned value = 127;
std::cout << "value = " << value << ", counting bits = " << count_bits(value) << '\n';
}
To ostatnie bazuje na algorytmie: https://en.wikipedia.org/wiki/Hamming_weight