1. 程式人生 > 實用技巧 >二進位制數中1的個數

二進位制數中1的個數

一、題目

請實現一個函式,輸入一個整數,輸出該數二進位制表示中1的個數。例如,把9表示成二進位制是1001,有2位是1。因此如果輸入9,該函式輸出2。

二、解決方案

1. 避免死迴圈的位操作

時間複雜度為O(log2n)。

用位操作優於除法,考慮負數,比如n = 0x800000000,迴圈右移n可能會引起死迴圈。因此,可以迴圈左移1和n做與運算避免死迴圈。

/* 避免死迴圈的位操作 */
int NumberOf1_Solution1(int n)
{
    int count = 0;
    unsigned int flag = 1;
    while (flag)
    {
        if (n & flag)
            ++count;  //效率比count好
        flag <<= 1;
    }

    return count;
}

2. 位操作

時間複雜度為O(M),其中M為n中1的個數。

將n與(n-1)進行與運算,會把該數最右邊的1變成0。那麼1有多少個,就可以進行多少次與操作。

/* 最優的位操作 */
int NumberOf1_Solution2(int n)
{
    int count = 0;

    while (n)
    {
        ++count;
        n &= (n-1);
    }

    return count;
}