给定一个uint8_t,找出设置了多少位
Given an uint8_t, find out how many bits are set
我确实有一个 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;
}
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++/Linux中设置单调时钟的一些技巧
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 嵌套在类中时无法设置成员数据
- 需要帮助设置在C++中使用的Potrace
- 复制列表初始化的隐式转换的等级是多少
- 如何在自删除后将对象设置为nullptr
- while循环中while循环的时间复杂度是多少
- 将指针设置为"nullptr"并不能防止双重删除?
- 如何在Ubuntu中使用cmake设置qt4
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 如何在boost beast http请求中设置http头
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 在 Linux 中存储区域设置名称的缓冲区大小应该是多少?
- 给定一个整数 N>0,区间 [0, 2^N) 中有多少个整数正好有 N-1 个设置位?编写一个返回正确答案的简短函数
- 如何找出在两个整数的乘积中设置了多少位(等于 1)
- 给定一个uint8_t,找出设置了多少位
- 设置单元测试需要多少个项目