1. 程式人生 > >求二進位制中“1”的個數

求二進位制中“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;
}