n&(n-1)计算比特位1的个数的原理

n&(n-1)统计二进制比特中1的个数spa

unsigned int bitOneCount(unsigned int n)
{
    unsigned int count = 0;
while(0 < n) { n &= (n--); count++; }
return count; }

蓝色的是n的初始值,黑色的是当前最新的n-1,也就是上一行的值减1,红色的是n的当前最新值(n&=(n-1));最后n为0时中止计算每次循环引用计数加1code

经过下面的演算,咱们发现每次循环事后n最右边的比特1老是要和比它减1的数相与(例如:100b & 011b = 000b),其结果是n最后一个比特和该比特右边的都会变成0,也就是最后一个比特1消失;blog

由于任何一个只有1个比特1的数和比它小1的数进行&结果为这几个比特全0;可是左边的则保留,由于左边的并无发生比特变化。下面每一行的第一行是n,第二行是n-1it

01100110
01100101  循环完一次,引用计数++io


01100100
01100011  循环完一次,引用计数++class


01100000
01011111  循环完一次,引用计数++循环


01000000
00111111  循环完一次,引用计数++;引用


00000000  n>0不成立,再也不进入循环二进制

咱们看到共有4次递增,引用计数初始为0,因此计算出比特1的个数为4,与真实结果相符。统计

相关文章
相关标签/搜索