我编写了一个算法(取自“C 编程语言”),可以非常快速地计算 1 位的数量:
int countBit1Fast(int n)
{
int c = 0;
for (; n; ++c)
n &= n - 1;
return c;
}
Run Code Online (Sandbox Code Playgroud)
但是一位朋友告诉我,__builtin__popcount(int)这要快得多,但便携性较差。我试了一下,速度快了很多倍!为什么这么快?我想尽可能快地计算位,但不坚持使用特定的编译器。
编辑:我可以在 PIC 微控制器和非英特尔处理器上使用它,所以我需要最大的便携性。
我试图找到两个整数之间的汉明距离,我得到了它:
int count = 0;
for(int i = 0; i < 32; i++)
{
if((x ^ y) & 1)
count++;
x >>= 1;
y >>= 1;
}
Run Code Online (Sandbox Code Playgroud)
但是,它不适用于:
if(x & 1 != y & 1)
Run Code Online (Sandbox Code Playgroud)
当 x = 1 和 y = 4 时,正确的结果是 2。但是,第二个版本输出 1。听起来我需要学习离散逻辑课程。
如何重写第二个 if 语句以使其工作?