題目:請實現(xiàn)一個函數(shù), 輸入一個整數(shù),輸出該數(shù)二進制表示中1的個數(shù)。例如把9表示成二進制是1001 ,有2位是1。因此如果輸入9,則該函數(shù)輸出2。
解題思路:
最簡單的方式,將數(shù)字與1相與判斷是不是1,然后將數(shù)字每次右移一位然后再次與1相與。
注意:正整數(shù)二進制表示最高位是0,負整數(shù)二進制表示最高位是1。如果是負數(shù)的話,一直右移那么與1相與一直是1。怎么辦呢?在Java中int是32位,我們只需要右移32次就可以了。
/**
* @param n
* @return 數(shù)字二進制表示中1的個數(shù)
*/
public static int numberOfOne(int n) {
int result = 0;
for (int i = 0; i < 32; i++) {
result += (n & 1);
/**
* 這里用帶符號右移和無符號右移都可以,因為循環(huán)移動32次就結(jié)束了,不會出現(xiàn)死循環(huán)的問題。
*/
n >>= 1;
}
return result;
}
測試用例
/**
* -5在計算機中用補碼表示是 1111 1111 1111 1111 1111 1111 1111 1011
*/
System.out.println(numberOfOne(-5));
System.out.println(numberOfOne(5));
輸出結(jié)果
31
2
參考鏈接: