求整型二进制表示中1的个数

方法1,i不断右移动,再i&1 ,等于1 counter++

int counter=0

while(i&1)
{
  counter++;
  i=i>>1;
}
View Code

方法2,i不断左移动,再判断正负,不过对于unsigned int要转int ,

int counter=0;

while(i<0)
{
  counter++;
  i=i<<1;
}

方法3,i=i&i-1; 若i>0,counter++

1 int counter=0;
2 
3 while(i)
4 {
5  counter++;
6  i=i&(i-1);
7 }

方法4,速度不一定最快,但是想法绝对巧妙。 说一下其中奥妙,其实很简单,先将n写成二进制形式,然后相邻位相加,重复这个过程,直到只剩下一位。以217(11011001)为例,217的二进制表示中有5个1。这种太吊

int BitCount4(unsigned int n) 
{ 
    n = (n & 0x55555555) + ((n >> 1) & 0x55555555) ; //01010001+01000100=10010101
    n = (n & 0x33333333) + ((n >> 2) & 0x33333333) ; //00010001+00100001=00110010
    n = (n & 0x0f0f0f0f) + ((n >> 4) & 0x0f0f0f0f) ;         //00000010+00000011=00000101
    n = (n & 0x00ff00ff) + ((n >> 8) & 0x00ff00ff) ;        //00000101+00000000=00000101
    n = (n & 0x0000ffff) + ((n >> 16) & 0x0000ffff) ;      //00000101+00000000=00000101
    return n ; 
}
原文地址:https://www.cnblogs.com/cavehubiao/p/3346163.html