帶你認識按位操做符

前言

最近 CodeReview 時發現,項目的歷史代碼中有一些,像 &、|、^、~、<<、>>、>>> 的符號, 本人不甚瞭解原理, 翻文檔學習了一下。javascript

按位操做符 (Bitwise operators) 將其操做數(operands)當作32位的比特序列(由 0 和 1 組成)。就是說,js裏對一個數據進行位運算時,會先將操做數轉換成 32 位二進制數,而後按位操做符操做數字的二進制形式,最後返回一個結果,返回的值依然是標準的JavaScript數值。java

按位與( AND)

兩個二進制數,它們對應位的數都是1時,結果才爲1,不然爲0。api

在 javascript 中, 按位與用 &表示。例如:markdown

9 (base 10) = 00000000000000000000000000001001 (base 2)
    14 (base 10) = 00000000000000000000000000001110 (base 2)
                   --------------------------------
14 & 9 (base 10) = 00000000000000000000000000001000 (base 2) = 8 (base 10)
複製代碼

按位操做符的使用-按位與oop

按位或(OR)

兩個二進制數,它們對應位的數至少有一個1時,結果爲1,不然爲0。post

在 javascript 中, 按位或用 |表示。例如:學習

9 (base 10) = 00000000000000000000000000001001 (base 2)
    14 (base 10) = 00000000000000000000000000001110 (base 2)
                   --------------------------------
14 | 9 (base 10) = 00000000000000000000000000001111 (base 2) = 15 (base 10)
複製代碼

按位異或(XOR)

兩個二進制數,它們對應位的數有且只有一個1時,結果爲1,不然爲0。spa

在 javascript 中, 按位異或用 ^表示。例如:code

9 (base 10) = 00000000000000000000000000001001 (base 2)
    14 (base 10) = 00000000000000000000000000001110 (base 2)
                   --------------------------------
14 ^ 9 (base 10) = 00000000000000000000000000000111 (base 2) = 7 (base 10)
複製代碼

按位操做符的使用-按位異或orm

按位非(NOT)

反轉對應位的數, 若是是 1 , 結果爲 0; 若是是 0, 結果爲 1。

在 javascript 中, 按位非用 ~表示。例如:

9 (base 10) = 00000000000000000000000000001001 (base 2)
                 --------------------------------
  ~9 (base 10) = 11111111111111111111111111110110 (base 2) = -10 (base 10)
複製代碼

左移

將二進制數的右第一位向左移動指定的位數,右側用 0 補充。

在 javascript 中, 左移用 << 表示。例如:

9 (base 10): 00000000000000000000000000001001 (base 2)
                    --------------------------------
  9 << 2 (base 10): 00000000000000000000000000100100 (base 2) = 36 (base 10) 
複製代碼

有符號右移

將二進制數的右第一位向右移動指定的位數, 右側移出的位放棄, 拷貝移出的最左側位,填充給左側移出後缺乏的位。因爲新的最左側的位老是和之前相同,最左側的符號位沒有改變。

在 javascript 中, 有符號右移用 >> 表示。例如:

9 >> 2 獲得 2:

9 (base 10): 00000000000000000000000000001001 (base 2)
                  --------------------------------
9 >> 2 (base 10): 00000000000000000000000000000010 (base 2) = 2 (base 10)
複製代碼

-9 >> 2 獲得 -3,由於符號被保留了。

-9 (base 10): 11111111111111111111111111110111 (base 2)
                   --------------------------------
-9 >> 2 (base 10): 11111111111111111111111111111101 (base 2) = -3 (base 10)
複製代碼

無符號右移

將二進制數的右第一位向右移動指定的位數, 右側移出的位放棄, 左側用 0 補充。

在 javascript 中, 無符號右移用 >>> 表示。例如:

對於正數, 9 >>> 29 >> 2 的值是同樣的。

9 (base 10): 00000000000000000000000000001001 (base 2)
                   --------------------------------
9 >>> 2 (base 10): 00000000000000000000000000000010 (base 2) = 2 (base 10)
複製代碼

而對於負數是不同的, 由於左側填充了 0, 前面的負號丟失了。

-9 (base 10): 11111111111111111111111111110111 (base 2)
                    --------------------------------
-9 >>> 2 (base 10): 00111111111111111111111111111101 (base 2) = 1073741821 (base 10)
複製代碼

結語

學習完了以後,我會整理一份 JavaScript 中常常用到按位操做符的經典案例。

參考

相關文章
相關標籤/搜索