方法1,i不断右移动,再i&1 ,等于1 counter++
int counter=0 while(i&1) { counter++; i=i>>1; }
方法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 ; }