lintcode--二進制有多少個1

計算在一個 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;
}
}


發佈了124 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章