目录

JavaScript 位运算


JavaScript 位运算符

Operator Name Description
& AND Sets each bit to 1 if both bits are 1
| OR Sets each bit to 1 if one of two bits is 1
^ XOR Sets each bit to 1 if only one of two bits is 1
~ NOT Inverts all the bits
<< Zero fill left shift Shifts left by pushing zeros in from the right and let the leftmost bits fall off
>> Signed right shift Shifts right by pushing copies of the leftmost bit in from the left, and let the rightmost bits fall off
>>> Zero fill right shift Shifts right by pushing zeros in from the left, and let the rightmost bits fall off

示例

Operation Result Same as Result
5 & 1 1 0101 & 0001  0001
5 | 1 5 0101 | 0001  0101
~ 5 10  ~0101  1010
5 << 1 10 0101 << 1  1010
5 ^ 1 4 0101 ^ 0001  0100
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 位有符号整数,因此它不会返回 10。它将返回 -6。

00000000000000000000000000000101 (5)

11111111111111111111111111111010 (~5 = -6)

有符号整数使用最左边的位作为减号。



JavaScript 按位与

当对一对位进行按位与运算时,如果两个位都为 1,则返回 1。

一位示例:
手术 结果
0 & 0 0
0 & 1 0
1 & 0 0
1 & 1 1
4 位示例:
手术 结果
1111 & 0000 0000
1111 & 0001 0001
1111 & 0010 0010
1111 & 0100 0100

JavaScript 按位或

当对一对位执行按位或时,如果其中一个位为 1,则返回 1:

一位示例:
手术 结果
0 | 0 0
0 | 1
1 | 0 1
1 | 1 1
4 位示例:
手术 结果
1111 | 0000 1111
1111 | 0001 1111
1111 | 0010 1111
1111 | 0100 1111

JavaScript 按位异或

当对一对位执行按位异或时,如果位不同则返回 1:

一位示例:
手术 结果
0 ^ 0 0
0 ^ 1
1 ^ 0 1
1 ^ 1
4 位示例:
手术 结果
1111 ^ 0000 1111
1111 ^ 0001 1110
1111 ^ 0010 1101
1111 ^ 0100 1011

JavaScript 按位与 (&)

仅当两位均为 1 时,按位 AND 才返回 1:

十进制 二进制
5 00000000000000000000000000000101
1 00000000000000000000000000000001
5 & 1 00000000000000000000000000000001 (1)

示例

let x = 5 & 1;
亲自试一试 »

JavaScript 按位或 (|)

如果其中一位为 1,则按位或返回 1:

十进制 二进制
5 00000000000000000000000000000101
1 00000000000000000000000000000001
5 | 1 00000000000000000000000000000101 (5)

示例

let x = 5 | 1;
亲自试一试 »

JavaScript 按位异或 (^)

如果位不同,按位 XOR 返回 1:

十进制 二进制
5 00000000000000000000000000000101
1 00000000000000000000000000000001
5 ^ 1 00000000000000000000000000000100 (4)

示例

let x = 5 ^ 1;
亲自试一试 »

JavaScript 按位非 (~)

十进制 二进制
5 00000000000000000000000000000101
~5 11111111111111111111111111111010 (-6)

示例

let x = ~5;
亲自试一试 »

JavaScript(零填充)按位左移 (<<)

这是零填充左移。从右侧推入一个或多个零位,最左边的位脱落:

十进制 二进制
5 00000000000000000000000000000101
5 << 1 00000000000000000000000000001010 (10)

示例

let x = 5 << 1;
亲自试一试 »

JavaScript(符号保留)按位右移 (>>)

这是保留右移的标志。最左边位的副本从左侧推入,最右边位脱落:

十进制 二进制
-5 11111111111111111111111111111011
-5 >> 1 11111111111111111111111111111101 (-3)

示例

let x = -5 >> 1;
亲自试一试 »

JavaScript(零填充)右移 (>>>)

这是零填充右移。从左侧推入一个或多个零位,最右侧的位脱落:

十进制 二进制
5 00000000000000000000000000000101
5 >>> 1 00000000000000000000000000000010 (2)

示例

let x = 5 >>> 1;
亲自试一试 »

二进制数

仅设置一位的二进制数很容易理解:

二进制表示 十进制值
00000000000000000000000000000001 1
00000000000000000000000000000010 2
00000000000000000000000000000100 4
00000000000000000000000000001000 8
00000000000000000000000000010000 16
00000000000000000000000000100000 32
00000000000000000000000001000000 64

再设置几个位即可揭示二进制模式:

二进制表示 十进制值
00000000000000000000000000000101 5 (4 + 1)
00000000000000000000000000001101 13 (8 + 4 + 1)
00000000000000000000000000101101 45 (32 + 8 + 4 + 1)

JavaScript 二进制数以二进制补码格式存储。

这意味着负数是该数加 1 的按位 NOT:

二进制表示 十进制值
00000000000000000000000000000101 5
11111111111111111111111111111011 -5
00000000000000000000000000000110 6
11111111111111111111111111111010 -6
00000000000000000000000000101000 40
11111111111111111111111111011000 -40

玩笑:

世界上只有10种人:懂二进制的人和不懂二进制的人。


将十进制转换为二进制

示例

function dec2bin(dec){
  return (dec >>> 0).toString(2);
}
亲自试一试 »

将二进制转换为十进制

示例

function bin2dec(bin){
  return parseInt(bin, 2).toString(10);
}
亲自试一试 »