二進制表示中1的個數

輸入一個整數,輸出該數二進制表示中1的個數。其中負數用補碼錶示。spa

1 int cnt=0;
2 int cnt=0;
3 while(a){
4     a=a&(a-1);
5     cnt++;
6 }

分析一下代碼: 這段小小的代碼,非常巧妙。code

若是一個整數不爲0,那麼這個整數至少有一位是1。若是咱們把這個整數減1,那麼原來處在整數最右邊的1就會變爲0,原來在1後面的全部的0都會變成1(若是最右邊的1後面還有0的話)。其他全部位將不會受到影響。
舉個例子:一個二進制數1100,從右邊數起第三位是處於最右邊的一個1。減去1後,第三位變成0,它後面的兩位0變成了1,而前面的1保持不變,所以獲得的結果是1011.咱們發現減1的結果是把最右邊的一個1開始的全部位都取反了。這個時候若是咱們再把原來的整數和減去1以後的結果作與運算,從原來整數最右邊一個1那一位開始全部位都會變成0。如1100&1011=1000.也就是說,把一個整數減去1,再和原整數作與運算,會把該整數最右邊一個1變成0.那麼一個整數的二進制有多少個1,就能夠進行多少次這樣的操做。
相關文章
相關標籤/搜索