给定一个uint8_t,找出设置了多少位

Given an uint8_t, find out how many bits are set

本文关键字:设置 多少 uint8 一个      更新时间:2023-10-16

我确实有一个 8 位无符号整数,我想知道它有多少位设置为 1。有一种简单的方法,即 AND-ing (&) 它与 0x01、0x02、0x04、0x08、0x0F、0x10、0x20、0x40、0x80、0xF0并为每个变量递增一个不为零的变量,但我想听到更复杂的解决方案。

使用内置的:

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];
}

您可以使用带有位移的 while 循环:

uint8_t someInt = 13;
int num_ones = 0;
while (someInt)
{
    num_ones += someInt & 1;
    someInt = someInt >> 1;
}