二進制中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));