位元運算子
位元運算子
位元運算子把他們的運算元視為一組 32 位元的集合(零或一),而非十進制、十六進制、八進制。例如,十進制數 9 的二進制表示法為 1001。位元運算子對這些二進制表示法進行運算,並返回標準的 JavaScript 數值。
下表解說 JavaScript 的位元運算子。
運算子 | 用法 | 說明 |
---|---|---|
位元 AND | a & b | 每一個對應至同一位元位置的兩個運算元兩者為 1 時,返回 1。 |
位元 OR | a | b | 每一個對應至同一位元位置的兩個運算元兩者或其中一者為 1 時,返回 1。 |
位元 XOR | a ^ b | 每一個對應至同一位元位置的兩個運算元其中一者而非兩者為 1 時,返回 1。 |
位元 NOT | ~ a | 反轉運算元的位元。 |
左移 | a << b | 往左移動 a 的二進制表示法 b 位元,從右邊補 0。 |
維持符號右移 | a >> b | 往右移動 a 的二進制表示法 b 位元,丟棄移出的位元。 |
填 0 右移 | a >>> b | 往右移動 a 的二進制表示法 b 位元,丟棄移出的位元,並從左邊補 0。 |
表 3.5: 位元運算子
位元邏輯運算子
大致上,位元邏輯運算子的運作如下︰
- 運算元轉換成 32 位元整數,並表示為一系列的位元(0 或 1)。
- 第一個運算元的每一個位元與第二個運算元對應的位元結成配對︰第一個位元對第一個位元、第二個位元對第二個位元,餘類推。
- 運算子套用到每一對位元,運算結果以位元構成。
舉個例子,9 的二進制表示法是 1001,15 的二進制表示法是 1111。因此,當位元的運算子套用到這些值上時,結果如下︰
- 15 & 9 的結果是 9 (1111 & 1001 = 1001)
- 15 | 9 的結果是 15 (1111 | 1001 = 1111)
- 15 ^ 9 的結果是 6 (1111 ^ 1001 = 0110)
位元位移運算子
位元位移運算子有兩個運算元︰第一個是被移動的數值,第二個指定第一個運算元要移動的位元位置的數目。位移運算元的方向是以使用的運算元來控制。
位移運算子轉換這些運算元為 32 位元整數,並返回與左邊運算元同類型的結果。
位移運算子列於下表。
運算子 | 說明 | 範例 |
---|---|---|
<<(左移) | 這個運算子把第一個運算元向左移動指定的位元數。丟棄向左移出的多餘位元。從右邊填補 0 的位元。 | 9<<2 的結果是 36,因為 1001 向左移動 2 位元而變成 100100,此即 36。 |
>>(維持符號右移) | 這個運算子把第一個運算元向右移動指定的位元數。丟棄向右移出的多餘位元。從左邊填補在最左邊複製的位元。 | 9>>2 的結果是 2,因為 1001 向右移動 2 位元而變成 10,此即 2。同樣的,-9>>2 的結果是 -3,因為保留了正負號。 |
>>>(填 0 右移) | 這個運算子把第一個運算元向右移動指定的位元數。丟棄向右移出的多餘位元。從右邊填補 0 的位元。 | 19>>>2 的結果是 4,因為 10011 向右移動 2 位元而變成 100,此即 4。對於非負數而言,補 0 右移和維持符號右移的結果相同。 |
表 3.6: 位元位移運算子