二進制中 1 的個數

輸入一個整數,輸出該數二進制表示中 1 的個數。java

 

 

 位與運算技巧:

  • n&(n-1) 去除 n 的位級表示中最低的那一位。例如對於二進制表示 10110100,減去 1 獲得 10110011,這兩個數相與獲得 10110000。
  • n&(-n) 獲得 n 的位級表示中最低的那一位。-n 獲得 n 的反碼加 1,對於二進制表示 10110100,-n 獲得 01001100,相與獲得 00000100。
  • n-n&(~n+1) 去除 n 的位級表示中最高的那一位。

移位運算:spa

  • >> n 爲算術右移,至關於除以 2n;
  • >>> n 爲無符號右移,左邊會補上 0。
  • << n 爲算術左移,至關於乘以 2n。

 

public class Solution {
   public int NumberOf1(int n) {
    int cnt = 0; //計數器
    while (n != 0) {  //計數器不等於 0 
        cnt++;         //計數器加一
        n &= (n - 1);   //若是當前位是1,則計數器加1
    }
    return cnt;
}
}

這應該是目前的最優解了。code

其複雜度僅僅與給定的數的1的個數有關。io

1111000 - 1 = 1110111class

一個二進制數減1的試過是他全部的1中最低位的1變成0,他後面的0變成1,因此將n&(n-1),就會將最低位的1變位0,不斷的循環直到把n中全部的1都替換爲0便可。循環

11000101010,須要5此循環。其複雜度O(M),M爲給定的數的1的個數。技巧

相關文章
相關標籤/搜索