《c程序设计语言》-2.9

#include <stdio.h>

/*int bitcount(unsigned x)
{
    int b;

    for(b = 0;x != 0;x >>= 1)
    {
        if(x & 1)
        b++;
    }
    return b;
   }*/

int bitcount(unsigned x)
{
    int b;
    for (b = 0; x != 0; x &= (x-1))
        b++;
    return b;
}

int main(void)
{
    unsigned x = 255;

    printf("%u,%d\n",x,bitcount(x));

    return 0;
}


解题思路:对于x的二进制形式,分为两种:最右边二进制位为0和最右边二进制位为1 

  1. 如果x的形式如XXX1, 那么x & (x-1)应该为 XXX0 & XXX1 = XXX0。 例如: 110_100_101 & 110_100_100 = 110_100_100。最右边的1被删除。
  2. 如果x的形式如XX10..00, 那么x & (x-1)应该为 XX01..11 & XX10..00 = XX00..00例如: 110_100_100 & 110_100_011 = 110_100_000。最右边的1被删除。

文字转载自: http://www.cnblogs.com/ningvsban/p/3781210.html 点击打开链接

 

posted @ 2014-10-31 11:17  司空格子Ored  阅读(203)  评论(0编辑  收藏  举报