要计算一个二进制数为1的位数,一个比较直接而又简单的方法就是 采用移位和(LSB&1)的算法。
但这里要说的是另外一个思路(来自《编程之美》), 即将一个数A&(A-1), 通过实验发现这样一个规律,即如果A只有一个位为1,那么A&(A-1) 就等于0;否则如果为1的位数大于1,那么A&(A-1) != 0. 很明显, 这个算法的时间复杂度为O(M) (M为位为1的个数),要优于上面经典算法的复杂度O(n) (n为所有二进制位数)。
代码如下供参考
int Get1Count(int input)
923 {
924 int num = 0;
925
926 while (input)
927 {
928 input &= (input - 1);
929 num++;
930 }
931 return num;
932 }