2015-04-10 3 views
0

У меня есть 8-разрядное целое число без знака, и я хотел бы знать, сколько его битов установлено на 1. Существует тривиальный путь от AND-ing (&) с 0x01, 0x02, 0x04, 0x08, 0x0F, 0x10, 0x20, 0x40, 0x80, 0xF0 и приращением переменной для каждой из них, которая не равна нулю, но я бы хотел услышать более сложные решения.Учитывая uint8_t, узнайте, сколько бит установлено

+1

Вы можете использовать петлю и бит сдвиг. –

+0

Кроме ответа Барри, здесь некоторые интересные методы: http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetNaive –

ответ

2

Используйте builtin:

int bits_set(uint8_t x) { 
    return __builtin_popcount(x); 
} 

Или сделайте таблицу:

int bits_set(uint8_t x) { 
    // easy enough to generate this 
    static const uint8_t table[] = {0, 1, 1, 2, 1, 2, ... }; 

    // then it's just a lookup 
    return table[x]; 
} 
2

Вы можете использовать время цикла с bitshifting:

uint8_t someInt = 13; 
int num_ones = 0; 

while (someInt) 
{ 
    num_ones += someInt & 1; 
    someInt = someInt >> 1; 
} 
Смежные вопросы