文章目錄
- 一、什么是位運算?
- 二、如何使用
- 1. 位與(AND):&
- 用途
- (1)數據清零
- (2)判斷奇偶
- 2. 位或(OR):|
- 用途
- (1)向下取整
- 3. 位異或(XOR):^
- 4. 位非(NOT):~
- 5. 左移(Left Shift):<<
- 6. 右移(Right Shift):>>
- 7. 無符號右移(Unsigned Right Shift):>>>
- 注意優先級
一、什么是位運算?
位運算是一種對二進制
數進行操作的技術,常用于優化算法
和處理底層數據
。在JavaScript中,位運算符包括按位與(&)
、按位或(|)
、按位異或(^)
、左移(<<)
、右移(>>)
、無符號右移(>>>)
。這些運算符可以對數字的二進制表示進行操作,實現一些特定的位級操作。例如,按位與運算可以用來提取特定位的值,按位或運算可以將特定位設置為1,按位異或運算可以進行位翻轉等。通過合理使用位運算,可以提高代碼效率和性能
。
二、如何使用
1. 位與(AND):&
兩個位都為 1 時,結果才為 1。
5 & 3 // 在二進制中是 101 & 011 = 001 (十進制的 1)
用途
(1)數據清零
// 任何數 & 0都為 0
5 & 0 === 0
(2)判斷奇偶
根據最未位是0還是1來決定,為0就是偶數,為1就是奇數
(a & 1) === 0 等價于 a % 2 === 0;
(5 & 1) === 1;
(4 & 1) === 0;
2. 位或(OR):|
兩個位中至少有一個為 1 時,結果為 1。
5 | 3 // 在二進制中是 101 | 011 = 111 (十進制的 7)
用途
(1)向下取整
(3.6 | 0) === 3
位運算符| 0
的工作原理是利用按位或運算符|將一個數字轉換為32位有符號整數。這個操作會將數字的小數部分截斷,只保留整數部分。原理
如下:
JavaScript
中的數字是以64位浮點數
的形式存儲的,其中包含整數部分
和小數部分
。- 當應用位運算符
| 0
時,會將數字轉換為32位有符號整數
。 - 按位或運算符
|
會對數字的二進制表示的每一位進行按位或
運算。 - 由于
32位整數無法表示小數部分
,因此在進行按位或運算時,小數部分被截斷
,只保留整數部分。 - 最終的結果是一個
32位整數
,其中小數部分被丟棄,只保留整數部分。
3. 位異或(XOR):^
兩個位相同則結果為 0,不同則結果為 1。
5 ^ 3 // 在二進制中是 101 ^ 011 = 110 (十進制的 6)
4. 位非(NOT):~
反轉操作數的每一位,即將 1 變為 0,將 0 變為 1。
~5 // 在二進制中是 0000 0101 的 NOT 為 1111 1010,因為 JavaScript 使用 32 位整數,所以結果是 -6
5. 左移(Left Shift):<<
將一個數的所有位向左移動指定的位數,左邊空出的位填充 0。左移一位相當于乘以 2 。
5 << 1 // 101 (5 的二進制) << 1 = 1010 (十進制的 10)
5 << 2 // 101 (5 的二進制) << 2 = 101000 (十進制的 20)
6. 右移(Right Shift):>>
將一個數的所有位向右移動指定的位數,右邊空出的位填充符號位(左邊最高位的值)。右移一位相當于除以 2 ,且結果總是向零截斷。
5 >> 1 // 101 (5 的二進制) >> 1 = 0101 (十進制的 5)
-5 >> 1 // 1111 1111 1111 1111 1111 1111 1111 1011 (-5 的二進制補碼) >> 1 = 1111 1111 1111 1111 1111 1111 1111 1110 (十進制的 -3)
7. 無符號右移(Unsigned Right Shift):>>>
將一個數的所有位向右移動指定的位數,右邊空出的位始終填充 0。無符號右移不改變符號位,因此可以用于正數和負數。
5 >>> 1 // 0000 0101 (5 的二進制) >>> 1 = 0000 0010 (十進制的 2)
-5 >>> 1 // 1111 1111 1111 1111 1111 1111 1111 1011 (-5 的二進制補碼) >>> 1 = 1111 1111 1111 1111 1111 1111 1111 1110 (十進制的 2147483646)
注意優先級
在JavaScript中,位運算符
的優先級
是相對較低
的,位運算符的優先級低于算術運算符(如加法、減法)、關系運算符(如大于、小于)、邏輯運算符(如與、或)等常見運算符。如果表達式中包含多種類型的運算符,需要使用括號
來明確指定運算的順序,以確保邏輯正確性。