最近 CodeReview 時發現,項目的歷史代碼中有一些,像 &、|、^、~、<<、>>、>>>
的符號, 本人不甚瞭解原理, 翻文檔學習了一下。javascript
按位操做符 (Bitwise operators) 將其操做數(operands)當作32位的比特序列(由 0 和 1 組成)。就是說,js裏對一個數據進行位運算時,會先將操做數轉換成 32 位二進制數,而後按位操做符操做數字的二進制形式,最後返回一個結果,返回的值依然是標準的JavaScript數值。java
兩個二進制數,它們對應位的數都是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
兩個二進制數,它們對應位的數至少有一個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)
複製代碼
兩個二進制數,它們對應位的數有且只有一個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)
複製代碼
反轉對應位的數, 若是是 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 >>> 2
和 9 >> 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 中常常用到按位操做符的經典案例。