數據結構與算法(位運算) --javascript語言描述

二進制中1的個數

請實現一個函數,輸入一個整數,輸出該數二進制表示1的個數。例如把9表示成二進制是1001,有2位是1。所以若是輸入9,該函數輸出2。算法

首先對於二進制1的求解,在這裏,咱們最應該想到的就是關於位運算的一些操做符。總共有五種運算,分別是:與(&),或(|),異或(^),右移(>>),左移(<<)。函數

第一種可能會引發死循環的解法:
思路1:先對你所給的這個整數進行判斷,這個數的最右邊是否是1。若是是1,給一個計數器,給它加1。接着把輸入的整數右移一位,這樣一直進行移位,最後直到這個整數變成0爲止,而後輸出計數器就行了。code

function NumberOf1(n)
{
  let count = 0;
  while(n) {
    if(n & 1) {
      count ++;
    }
    n = n >> 1;
  }
  return count;
}
console.log(NumberOf1(9));

這個算法對於無符號數來講沒有問題,但是對於有符號數問題就大了,極有可能形成死循環。當n爲負數時,n右移在最高位補1(爲了保證數據爲負數),於是最終就會造成死循環。好比:0x80000000時,這時候就會出現問題,當右移一位的時候時,就變成了0xC0000000。由於是對負數的移位,因此必須保證移位後是個負數,因此最高位永遠都會是1,因此也就意味這最終這個數字永遠會死循環下去。io

思路2:移動1,先判斷最低位是否是1,而後把1移成2。再與整數比比較,就能判斷倒數第二位是否是1,依次下去。。。這樣最終就能達成一個效果,獲得全部的1的個數。console

function NumberOf1(n) {

  let count = 0;
  let flag = 1;
  while(flag) {
    if(n & flag) {
      count ++;
    }
    flag = flag << 1;
  }
  return count;
}
console.log(NumberOf1(9));

最後,咱們提供出來一種最好的方法。function

思路3:把一個整數減去了1,再和原整數作與運算,會把這個整數最右邊一個1變成0,而且把這個1後面的0都變成1。那麼一個整數的二進制有多少個1,就能夠進行多少次這樣的操做,最後,經過把計數器肯定運算次數,輸出計數器就行了。循環

//更好的解法
function NumberOf1(n) {
  let count = 0;
  while(n) {
    count ++;
    n = (n-1) & n;
  }
  return count;
}
console.log(NumberOf1(9));
相關文章
相關標籤/搜索