一個整數的二進位制表示中1的個數
阿新 • • 發佈:2019-02-11
給定一個整數,判斷其二進位制表示中1的個數。
第一種比較直接的思路是
1. 把這個數的低位與1取與運算,
2. 再把這個數右移1位,
3. 返回1,
結果:統計這個過程中1的個數。
但這種思路存在一個侷限,就是如果這個數是負數,那麼符號位在右移的過程中仍舊是1,這樣迴圈結束的條件不太好判斷,而且,這也改變了輸入的引數的n。
比較普遍適用的思路2是:用一個無符號數flag,從1開始,跟n取餘,對結果進行比較,如果是1,則計數加1;然後讓flag左移1。這樣迴圈,直到flag迴圈為0時,則n的所有位數都已經比較過了,輸出計數結果即可。程式碼如下:
思路3:一個小的技巧是:對於任意整數n,令其和n-1做與運算,再把結果賦值給n,這相當於把整數n的最右側的1給變為0. 利用這個思路可以設計出效率更高的演算法。程式碼如下://二進位制中1的個數。解法1 //此種方法不論n為正數或者n為負數均可 int NumberOf1(int n){ int count = 0; unsigned flag = 1; while (flag){ if (n & flag) count++; flag <<= 1; } return count; }
//二進位制中1的個數。解法2
//此種方法不論n為正數或者n為負數均可
int NumberOf1(int n){
int count = 0;
while (n){
count++;
n = (n-1)&n;
}
return count;
}