題目要求
輸入一個整數(shù)擦囊,輸出該數(shù)二進制表示中1的個數(shù),例如:把9表示成二進制是1001,那么函數(shù)輸出2
題目解析
思路一:
- 分析
除非n==0;那么二進制表示中必然存在1冤议。
我們可以發(fā)現(xiàn)當我們給一個整數(shù)-1時骄瓣,這個整數(shù)二進制表示中最右面的1將變?yōu)?停巷,而其右邊如果有0將全變?yōu)?;
此時我們將(n-1) & n 榕栏,可以直接消除掉最右面的1畔勤。
重復至n==0,循環(huán)次數(shù)即為1的個數(shù)扒磁。
- 代碼段
public static int getNumOfOne(int n) {
int num = 0 ;
while(n!=0) {
num ++ ;
n = (n-1) & n ;
}
return num ;
}
測試代碼
public static void main(String[] args) {
System.out.println(getNumOfOne(9));
System.out.println(getNumOfOne(1));
System.out.println(getNumOfOne(0x7fffffff));
System.out.println(getNumOfOne(0xffffffff));
System.out.println(getNumOfOne(0x80000000));
System.out.println(getNumOfOne(0));
System.out.println(getNumOfOne(-5));
}
運行結果
2
1
31
32
1
0
31