Brian Kernighan’s Algorithm(布赖恩·克尼根算法)

发布于 2023-07-05  76 次阅读


public static int Func(int x) 
{ 
  int countx = 0; 
  while (x > 0) 
   { x = x & (x - 1); 
   countx++; 
    } 
  return countx; 
}
以上代码是一个函数 Func(int x),其作用是计算一个整数 x 的二进制表示中有多少个位为 1。

函数首先声明一个整型变量 countx 并初始化为 0,用于计数位为 1 的数量。然后,进入一个循环,条件是 x 大于 0。在每次循环中,通过 x = x & (x - 1) 的操作,将 x 的最低位的 1 变为 0。同时,将结果赋值给 x,以便进行下一轮迭代。 

最后,当 x 变为 0 时,退出循环,并返回最终的计数值 countx。

该函数利用了一个经典的算法,称为 布赖恩·克尼根算法,用于高效地计算一个数的二进制表示中有多少个位为 1。该算法的基本思想是每次将 x 与 x-1 进行按位与运算,会将 x 的最低位的 1 变为 0。通过不断迭代这个过程,直到 x 变为 0,就可以统计出其中有多少个位为 1。

该函数在每次迭代中打印出 x 的值,可以用于观察算法的执行过程和中间结果。


其关键原理在于 &

按位与运算(&)是对两个整数的二进制表示进行逐位比较的操作,只有当对应位置上的两个位都为 1 时,结果位才为 1,否则为 0。

下面是按位与运算的规则:

0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
举个例子,假设我们有两个整数 a = 10 和 b = 6,它们的二进制表示分别为:
css
Copy code
a = 1010
b = 0110
将这两个二进制数进行按位与运算,我们得到:

markdown
Copy code
  1010
& 0110
-------
  0010
因此,对于 a = 10 和 b = 6,它们的按位与运算的结果是 2。

总结起来,按位与运算将两个整数的二进制表示进行逐位比较,只有当对应位置上的两个位都为 1 时,结果位才为 1。其他情况下,结果位都为 0。