JavaScript 位運算符
JavaScript 位運算符
運算符 | 名稱 | 描述 |
---|---|---|
& | AND | 如果兩位都是 1 則設置每位為 1 |
| | OR | 如果兩位之一為 1 則設置每位為 1 |
^ | XOR | 如果兩位只有一位為 1 則設置每位為 1 |
~ | NOT | 反轉所有位 |
<< | 零填充左位移 | 通過從右推入零向左位移,并使最左邊的位脫落。 |
>> | 有符號右位移 | 通過從左推入最左位的拷貝來向右位移,并使最右邊的位脫落。 |
>>> | 零填充右位移 | 通過從左推入零來向右位移,并使最右邊的位脫落。 |
實例
操作 | 結果 | 等同于 | 結果 |
---|---|---|---|
5 & 1 | 1 | 0101 & 0001 | 0001 |
5 | 1 | 5 | 0101 | 0001 | 0101 |
5 ^ 1 | 4 | 0101 ^ 0001 | 0100 |
~ 5 | 10 | ~0101 | 1010 |
5 << 1 | 10 | 0101 << 1 | 1010 |
5 >> 1 | 2 | 0101 >> 1 | 0010 |
5 >>> 1 | 2 | 0101 >>> 1 | 0010 |
JavaScript 使用 32 位按位運算數
JavaScript 將數字存儲為 64 位浮點數,但所有按位運算都以 32 位二進制數執行。
在執行位運算之前,JavaScript 將數字轉換為 32 位有符號整數。
執行按位操作后,結果將轉換回 64 位 JavaScript 數。
上面的例子使用 4 位無符號二進制數。所以 ~ 5 返回 10。
由于 JavaScript 使用 32 位有符號整數,JavaScript 將返回 -6。
00000000000000000000000000000101 (5)
11111111111111111111111111111010 (~5 = -6)
有符號整數使用最左邊的位作為減號。
位運算 AND
當對一對數位執行位運算 AND 時,如果數位均為 1 則返回 1。
單位示例:
運算 | 結果 |
---|---|
0 & 0 | 0 |
0 & 1 | 0 |
1 & 0 | 0 |
1 & 1 | 1 |
四位示例:
運算 | 結果 |
---|---|
1111 & 0000 | 0000 |
1111 & 0001 | 0001 |
1111 & 0010 | 0010 |
1111 & 0100 | 0100 |
位運算 OR
當對一對數位執行位運算 OR 時,如果其中一位是 1 則返回 1:
單位示例
運算 | 結果 |
---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
四位運算:
操作 | 結果 |
---|---|
1111 | 0000 | 1111 |
1111 | 0001 | 1111 |
1111 | 0010 | 1111 |
1111 | 0100 | 1111 |
位運算 XOR
當對一對數位進行位運算 XOR 時,如果數位是不同的則返回 1:
單位示例:
運算 | 結果 |
---|---|
0 ^ 0 | 0 |
0 ^ 1 | 1 |
1 ^ 0 | 1 |
1 ^ 1 | 0 |
四位示例:
運算 | 結果 |
---|---|
1111 ^ 0000 | 1111 |
1111 ^ 0001 | 1110 |
1111 ^ 0010 | 1101 |
1111 ^ 0100 | 1011 |
JavaScript 位運算 AND (&)
如果位數都是 1,則位運算 AND 返回 1:
十進制 | 二進制 |
---|---|
5 | 00000000000000000000000000000101 |
1 | 00000000000000000000000000000001 |
5 & 1 | 00000000000000000000000000000001 (1) |
實例
var x = 5 & 1;
JavaScript 位運算 OR (|)
如果數位之一是 1,則位運算 OR 返回 1:
十進制 | 二進制 |
---|---|
5 | 00000000000000000000000000000101 |
1 | 00000000000000000000000000000001 |
5 | 1 | 00000000000000000000000000000101 (5) |
實例
var x = 5 | 1;
JavaScript 位運算 XOR (^)
如果數位是不同的,則 XOR 返回 1:
十進制 | 二進制 |
---|---|
5 | 00000000000000000000000000000101 |
1 | 00000000000000000000000000000001 |
5 ^ 1 | 00000000000000000000000000000100 (4) |
實例
var x = 5 ^ 1;
JavaScript 位運算 NOT (~)
十進制 | 二進制 |
---|---|
5 | 00000000000000000000000000000101 |
~5 | 11111111111111111111111111111010 (-6) |
實例
var x = ~5;
JavaScript(零填充)位運算左移(<<)
這是零填充的左移。一個或多個零數位從右被推入,最左側的數位被移除:
十進制 | 二進制 |
---|---|
5 | 00000000000000000000000000000101 |
5 << 1 | 00000000000000000000000000001010 (10) |
實例
var x = 5 << 1;
JavaScript(有符號)位運算右移(>>)
這是保留符號的右移。最左側的數位被從左側推入,最右側的數位被移出:
十進制 | 二進制 |
---|---|
-5 | 11111111111111111111111111111011 |
-5 >> 1 | 11111111111111111111111111111101 (-3) |
實例
var x = -5 >> 1;
JavaScript(零填充)右移(>>>)
這是零填充的右移。一個或多個零數位從左側被推入,最右側的數位被移出:
十進制 | 二進制 |
---|---|
5 | 00000000000000000000000000000101 |
5 >>> 1 | 00000000000000000000000000000010 (2) |
實例
var x = 5 >>> 1;
32-bit 有符號整數(二進制數)
僅設置一位的 32 位整數很好理解:
二進制表示 | 十進制值 |
---|---|
00000000000000000000000000000001 | 1 |
00000000000000000000000000000010 | 2 |
00000000000000000000000000000100 | 4 |
00000000000000000000000000001000 | 8 |
00000000000000000000000000010000 | 16 |
00000000000000000000000000100000 | 32 |
00000000000000000000000001000000 | 64 |
多設置一些數位揭示了二進制的模式:
二進制表示 | 十進制值 |
---|---|
00000000000000000000000000000101 | 5 (4 + 1) |
00000000000000000000000000101000 | 40 (32 + 8) |
00000000000000000000000000101101 | 45 (32 + 8 + 4 + 1) |
負數是正數的二進制補碼加 1:
二進制表示 | 十進制值 |
---|---|
00000000000000000000000000000101 | 5 |
11111111111111111111111111111011 | -5 |
00000000000000000000000000101000 | 40 |
11111111111111111111111111011000 | -40 |
11111111111111111111111111011001 | -41 |