題目描述:
輸入一個整數,輸出該數32位二進制表示中1的個數。其中負數用補碼表示。
題解:
要判斷其二進制中有多少個 1 ,隻需将每一位依次右移至最低位,判斷該數字的最低位是否為1。
在右移時需要注意該數字的正負(在此題中必定為算術右移)
- 正數:高位補0
- 負數:高位補1
算術左移和算術右移主要用來進行有符号數的倍增、減半;
邏輯左移和邏輯右移主要用來進行無符号數的倍增、減半。
在計算機中,數字按位元組存儲,整數的存儲和運算都是其補碼表示的。可參考:深度剖析資料在記憶體中的存儲
假設現在需要判斷的數字為 110,且為負數,右移一位之後變成 111(高位補0),那我們判斷就會出錯,是以說這樣的方法對于負數不成立。
整數n,進行 n&(n-1) 運算,會把該二進制中的最右邊一個1變成0。
那麼一個整數的二進制表示中有多少個1,就可以進行多少次這樣的操作。
例如:11(0001 0011)
其二進制表示中有 3 個 1,在值為 0 之前 經過三次運算。

public int NumberOf1(int n) {
int count = 0;
while(n != 0){
count++;
n = n & (n-1);
}
return count;
}