位1的個數 邏輯位運算符

image

邏輯位運算符

位運算就是對二進制數執行計算,是整數的逐位運算。

圖片.png

& 按位與

若是兩個相應的二進制位都爲1,則該位的結果值爲1,不然爲0。
carbon(2).pngjavascript

| 按位或

兩個相應的二進制位中只要有一個爲1,該位的結果值爲1。
carbon(2).pngjava

^ 按位異或

若參加運算的兩個二進制位值相同則爲0,不然爲1。
carbon(2).png算法

~ 取反

~是一元運算符,用來對一個二進制數按位取反,即將0變1,將1。
carbon(3).png函數

<< 左移

用來將一個數的各二進制位所有左移N位,右補0。
carbon(3).png優化

>> 右移

將一個數的各二進制位右移N位,移到右端的低位被捨棄,對於無符號數, 高位補0。
carbon(3).pngspa

位1的個數

編寫一個函數,輸入是一個無符號整數(以二進制串的形式),返回其二進制表達式中數字位數爲 '1' 的個數(也被稱爲漢明重量)。
提示:
請注意,在某些語言(如 Java)中,沒有無符號整數類型。在這種狀況下,輸入和輸出都將被指定爲有符號整數類型,而且不該影響您的實現,由於不管整數是有符號的仍是無符號的,其內部的二進制表示形式都是相同的。
在 Java 中,編譯器使用二進制補碼記法來表示有符號整數。所以,在上面的 示例 3 中,輸入表示有符號整數 -3。
示例 1:3d

輸入:00000000000000000000000000001011
輸出:3
解釋:輸入的二進制串 00000000000000000000000000001011 中,共有三位爲 '1'。

示例 2:code

輸入:00000000000000000000000010000000
輸出:1
解釋:輸入的二進制串 00000000000000000000000010000000 中,共有一位爲 '1'。

示例 3:blog

輸入:11111111111111111111111111111101
輸出:31
解釋:輸入的二進制串 11111111111111111111111111111101 中,共有 31 位爲 '1'。

提示:
輸入必須是長度爲 32 的 二進制串 。
進階:
若是屢次調用這個函數,你將如何優化你的算法?圖片

思路及解法

循環檢查

1.循環檢查給定的整數每一位是否爲1;

2.將n跟給定的對應位置上的數字進行與運算,若是兩個相應的二進制位都爲1,則該位的結果值爲1,結果加1,不然爲0。

var hammingWeight = function (n) {
    let res = 0
    for (let i = 0; i < 32; i++) {
        //將每一位與n進行與運算,檢查是否每一位是否爲1
        if ((n & (1 << i)) != 0) {
            res++
        }
    }
    return res
};

位運算

  1. n &= n - 1 實現讓最低位變爲0
  2. 減小了循環的次數,記錄循環的次數
var hammingWeight = function(n) {
    let res = 0;
    while (n) {
        n &= n - 1; //將最低位變爲0
        res++;  //記錄變了幾回
    }
    return res;
};

carbon(3).png

補充無符號位移 >>>

>>>運算符執行五無符號右移位運算。它把無符號的 32 位整數全部數位總體右移。對於無符號數或正數右移運算,無符號右移與有符號右移運算的結果是相同的。

console.log(1000 >> 3);  //返回值125
console.log(1000 >>> 3);  //返回值12

對於負數

console.log(-1000 >> 3);  //返回值-125
console.log(-1000 >>> 3);  //返回值536870787

對於負數來講,無符號右移將使用 0 來填充全部的空位,同時會把負數做爲正數來處理,所得結果會很是大因此,使用無符號右移運算符時要特別當心,避免意外錯誤。

如圖:左側空位再也不用符號位的值來填充,而是用 0 來填充。

相關文章
相關標籤/搜索