輸入一個整數,輸出該數二進制表示下1的個數
暴力方法
在不借助Java的API的情況下要完成這道題的一個思路是循環統計各位是否為1。可能有人會想先將這個整數轉換為字符串表示的二進制再來統計1的個數。但是想想整數在計算機中本身就是存儲為二進制數的,比如7,二進制為111
,借助大多數高級語言都有的右移操作運算符便可完成這道題
public int NumberOf1(int n) {
int count = 0;
// 需要右移32次
int x = 32;
while (x-- != 0) {
count += n & 1;
n >>= 1;
}
return count;
}
討論區里更好的解法
public int NumberOf1(int n) {
int count = 0;
while (n != 0) {
n = n & (n - 1);
count += 1;
}
return count;
}
這個解法的思路妙在n = n & (n - 1)
這行代碼上,舉個栗子:假設n = 12,二進制表示為1100
,n-1 = 11,二進制表示為1011
,兩者相與為1000
,不難發現,在n的二進制表示中最右邊的1開始都變為了0。再在外面套個循環,相當于說能進行多少次這樣的操作,也就是有多少個1