我有一个8位无符号整数,我想知道有多少位设置为1。 通过AND(和)它与0x01,0x02,0x04,0x08,0x0F,0x10,0x20,0x40,0x80,0xF0并为每个不为零的变量递增一个变量有一个微不足道的方法,但我和#39;希望听到更复杂的解决方案。
答案 0 :(得分: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];
}
答案 1 :(得分:2)
你可以使用带位移的while循环:
uint8_t someInt = 13;
int num_ones = 0;
while (someInt)
{
num_ones += someInt & 1;
someInt = someInt >> 1;
}