計算在一個 32 位的整數的二進制表示中有多少個 1
.
給定 32
(100000),返回 1
給定 5
(101),返回 2
給定 1023
(111111111),返回 9
public class Solution {
/*
這種方法速度比較快,其運算次數與輸入n的大小無關,只與n中1的個數有關。
如果n的二進制表示中有k個1,那麼這個方法只需要循環k次即可。
其原理是不斷清除n的二進制表示中最右邊的1,同時累加計數器,直至n爲0
爲什麼n &= (n – 1)能清除最右邊的1呢?因爲從二進制的角度講,
n相當於在n - 1的最低位加上1。舉個例子,8(1000)= 7(0111)+ 1(0001),
所以
8 & 7 = (1000)&(0111)=
0(0000),
清除了8最右邊的1(其實就是最高位的1,因爲8的二進制中只有一個1)。
再比如7(0111)= 6(0110)+ 1(0001),所以7 & 6 = (0111)&(0110)= 6(0110),清除了7的二進制表示中最右邊的1(也就是最低位的1)
*/
public int countOnes(int num){
int count = 0;
while(num!=0){
num = num & (num-1);
count++;
}
return count;
}
}