C:计算正位的偷偷摸摸的方法?

标签 c bitwise-operators

所以我想看看是否有一些偷偷摸摸的位操作系列可以让我计算 uint32 中有多少位是 1(或者更确切地说是 count mod 2)。

“显而易见”的方式是这样的:

uint32 count_1_bits_mod_2(uint32 word) {
    uint32 i, sum_mod_2;
    for(i = 0; i < 32; i++)
        sum_mod_2 ^= word;
        word >>= 1;

是否有一些“偷偷摸摸”的方法可以在不使用循环的情况下获得正确的 sum_mod_2?

最佳答案

计算比特的最快方法is by using "magic numbers" :

unsigned int v = 0xCF31; // some number
v = v - ((v >> 1) & 0x55555555);                    // reuse input as temporary
v = (v & 0x33333333) + ((v >> 2) & 0x33333333);     // temp
unsigned int c = ((v + (v >> 4) & 0xF0F0F0F) * 0x1010101) >> 24; // count

这会打印 9(link 到 ideone)。

对于 32 位数字,这需要 12 次操作 - 与基于查找的方法采用的数字相同,但您不需要查找表。

关于C:计算正位的偷偷摸摸的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12055499/

相关文章:

c - 请问我能得到关于格式化的重点的提示吗?

c - 打印大写字母的十六进制

c - 寻找涉及逻辑运算的答案的清晰度

javascript - 如何强制按位运算符产生无符号结果?

c - automake 的 subdir-objects 选项不起作用

c - 跨平台 C 应用程序的 UTF8 支持

c - 为什么要在结构体之前添加标识符?我不明白为什么,如何解决这个问题?

Python 列表到位运算

php - 了解 PHP &(与号,按位与)运算符

java - 一条线上的多个分配未按预期工作