为什么使用 n&(n-1) 无法计算 1 的位数?

问题描述

我在 youtube 上发现了一个视频,它说通过使用 n&(n-1) 我们可以计算 1 的位数,这比将位右移一个然后检查最后一位要快得多。当我使用这种方法编写代码来计算位数时,它给出的输出为 9 而不是 3 - 如果我们将 01011 作为参数。

我调试了程序,但找不到为什么会这样?我在 while 循环条件下感到困惑,A 和 A-1 都是 512,即使 A&(A-1) = 1000000000 也不会退出循环0(零)。

如果有人知道我错过了什么,请告诉我。

#include <iostream>
using namespace std;    
int bits(unsigned int A){
        int counter=0;
        unsigned int t;
        while (A&(A-1))
        {
            counter++;
             A--;
        }
        return counter;
    }
    int main()
    {
        unsigned int A=01011;
        int res=bits(A);
        cout<<"Result is "<<res<<"\n";
        return 0;
    }

谢谢

你真的,

里沙布·拉格温德拉

解决方法

这是在不移位的情况下计算位数的 Kerningham 技巧。 (原作者比 Kerningham 早了 10 年,但 K 先生推广了它)。

n&(n-1) 剥离最不重要的一个,这意味着应该将结果写回 n

while (n) {
   ++counter;
   n&=n-1;
}