位运算

题目: 

int func(unsigned int i)
{
Unsigned int temp=i
Temp=(temp & 0x55555555)+((temp & 0xaaaaaaaa)>>1);
Temp=(temp & 0x33333333)+((temp & 0xccccccccc)>>2);
Temp=(temp & 0x0f0f0f0f)+((temp & 0xf0f0f0f0>>4);
Temp=(temp & 0xff00ff)+((temp & 0xff00fff00)>>8);
Temp=(temp & 0xffff)+((temp & 0xffff0000)>>16);
Return temp;
}

 

 

网上找到大牛说明:

unsigned   int bitcount(register   unsigned   int   x)
{
      x = (x & 0x55555555) + ((x >> 1) & 0x55555555); 
      x = (x & 0x33333333) + ((x >> 2) & 0x33333333); 
      x = (x & 0x0F0F0F0F) + ((x >> 4) & 0x0F0F0F0F); 
      x = (x & 0x00FF00FF) + ((x >> 8) & 0x00FF00FF); 
      x = (x & 0x0000FFFF) + ((x >>16) & 0x0000FFFF); 
      return(x   &   0x0000003f);
}
//进一步解释:看图吧,已经山穷水尽啦,如果还不明白请打120
 

  

位运算


位运算/*版一*/
unsigned int bitcount(unsigned int x)
{
      int b;
      for(b=0;x != 0;x >>= 1)
      {
            if(x&01)
            b++;
      }
      return b;
}


/*版二*/ unsigned int bitcount(unsigned int x) {  int b;  for(b=0;x != 0;)  {   x &= (x-1);    /* 这里的做用是每次都会在原的的数的基础上去掉一个1,贼酷 */   b++;  }   return b; } 转载自: http://www.cnitblog.com/wuzi/archive/2008/10/05/49851.html