求二进制中“1”的个数

题目描述:对于一个字节(8位)的无符号整型变量,二进制表示中“1”的个数,要求算法的执行效率尽可能高。

  • 方法一
    思路:首先比较好的方法是想到对二进制数进行 >>和&,这样就可以逐步求出序列中“1”的个数.(注:1&1=1, 1&0=0, 0&0=0)
int Count(int num)
{
    int count = 0;
    while (num)
    {
        count += (num & 0x01 );
        num >>= 1;
    }
    return count;
}


  • 方法二
    思路:对于一个二进制数,第一次除以2,原来数会减少一个0,如果有余,那么表示当前位置有个1。

例如:1010 0010
第一次除以2,商1010001,余数0;
第二次除以2,商101000 ,余数1。
int Count(int num)
{
    int count = 0;
    while (num)
    {
        if (num % 2 == 1)
            count++;
        num /= 2;        //同num >>= 1;
    }
    return count;
}
  • 方法三
    思路:位操作效率比除、余操作高,第三种也是一种巧妙方法。
int Count(int num)
{
    int count = 0;
    while (num)
    {
        num &= (num - 1);
        count++;
    } 
    return count;
}
  • 测试代码
int main()
{
    int i = 9;
    int N = 0;
    N = Count(i);
    printf("%d\n", N);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_37925202/article/details/80087992