Ниже приведены способы подсчета битов в беззнаковом целом числе. Все эти способы помещены в пространстве имен utils. По быстроте данные способы располагаются в следующем порядке (по возрастанию):
utils::count_bits < utils::count_bits2 < utils::count_bits3 <= utils::count_bits4
В следующей ссылке предлагается более подробное описание данной темы - "Обстоятельно о подсчете единичных битов".
Всем удачи!
#include <iostream>
#include <bitset>
/* support bits count */
class Bits_Counter {
static unsigned char byte_bit_count[256]; /* lookup table */
public:
// must be called before the first call
// to the count method
void initialize() {
int cnt, n;
for (int i = 0; i < 256; i++) {
cnt = 0;
n = i;
while (n != 0) {
n = n & (n - 1);
cnt++;
}
byte_bit_count[i] = cnt;
}
}
int count(unsigned int n) {
const unsigned char * byte = (unsigned char *) &n;
return byte_bit_count[byte[0]] + byte_bit_count[byte[1]] +
byte_bit_count[byte[2]] + byte_bit_count[byte[3]];
}
};
unsigned char Bits_Counter::byte_bit_count[256];
/* utilities for count bits in given number */
namespace utils {
using namespace std;
// show bits
void show_bits(unsigned int n) {
string binary;
while (n != 0) {
binary = bitset<8>(n).to_string();
cout << binary << endl;
n = n >> 1;
}
}
// count bits
int count_bits(unsigned int n) {
int cnt = 0;
while (n != 0) {
if (n & 1) cnt++;
n = n >> 1;
}
return cnt;
}
// count bits
int count_bits2(unsigned int n) {
int cnt = 0;
while (n != 0) {
n = n & (n - 1);
cnt++;
}
return cnt;
}
// count bits
int count_bits3(unsigned int n) {
Bits_Counter bits_counter;
bits_counter.initialize();
return bits_counter.count(n);
}
// count bits
int count_bits4(unsigned int n) {
static unsigned int mask[] = { 0x55555555,
0x33333333,
0x0F0F0F0F,
0x00FF00FF,
0x0000FFFF };
for (int i = 0, shift = 1; i < 5; i++, shift *= 2) {
n = (n & mask[i]) + ((n >> shift) & mask[i]);
}
return n;
}
};
int main()
{
unsigned int n = 55689; // 1010111000001
std::cout << utils::count_bits(n) << std::endl // 8
<< utils::count_bits2(n) << std::endl // 8
<< utils::count_bits3(n) << std::endl // 8
<< utils::count_bits4(n); // 8
return 0;
}