二進位制數中1的個數
阿新 • • 發佈:2020-08-22
一、題目
請實現一個函式,輸入一個整數,輸出該數二進位制表示中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;
}