二维码

JavaScript 按位运算

JavaScript 按位运算


JavaScript 按位运算符

运算符 名称 概述
& AND 如果两位均为 1,则将每位设置为 1
| OR 如果两位中有一位为 1,则将每位设置为 1
^ XOR 如果两位中只有一位为 1,则将每位设置为 1
~ NOT 反转所有位
<< Zero fill left shift 通过从右侧推入零来向左移动,并让最左边的位脱落
>> Signed right shift 通过从左侧推入最左边位的副本来向右移动,并让最右边的位脱落
>>> Zero fill right shift 通过从左侧推入零来右移,并让最右边的位脱落

例子

运算 结果 与…一样 结果
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 按位 AND

当对一对位进行按位与运算时,如果两个位都为 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 按位 OR

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

举个例子:

操作 结果
0 |0 0
0 |1 1
1 |0 1
1 |1 1

4 位示例:

操作 结果
1111 |0000 1111
1111 |0001 1111
1111 |0010 1111
1111 |0100 1111

JavaScript 按位 XOR

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

举个例子:

操作 结果
0 ^ 0 0
0 ^ 1 1
1 ^ 0 1
1 ^ 1 0

4 位示例:

操作 结果
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)
1
let x = 5 & 1;


JavaScript 按位 OR (|)

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

十进制 二元的
5 00000000000000000000000000000101
1 00000000000000000000000000000001
5 |1 00000000000000000000000000000101 (5)
1
let x = 5 | 1;


JavaScript 按位 XOR (^)

如果位不同,则按位异或返回 1:

十进制 二元的
5 00000000000000000000000000000101
1 00000000000000000000000000000001
5 ^ 1 00000000000000000000000000000100 (4)
1
let x = 5 ^ 1;


JavaScript 按位 NOT (~)

十进制 二元的
5 00000000000000000000000000000101
~5 11111111111111111111111111111010 (-6)
1
let x = ~5;


JavaScript (Zero Fill) Bitwise Left Shift (<<)

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

十进制 二元的
5 00000000000000000000000000000101
5 << 1 00000000000000000000000000001010 (10)
1
let x = 5 << 1;


JavaScript (Sign Preserving) Bitwise Right Shift (>>)

这是一个保持右移的标志。推送最左边位的副本 从左边进去,最右边的位脱落:

十进制 二元的
-5 11111111111111111111111111111011
-5 >> 1 11111111111111111111111111111101 (-3)
1
let x = -5 >> 1;


JavaScript (Zero Fill) Right Shift (>>>)

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

十进制 二元的
5 00000000000000000000000000000101
5 >>> 1 00000000000000000000000000000010 (2)
1
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 二进制数以 2 的补码格式存储。

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

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

笑话:

世界上只有 10 种类型的人:理解二进制的人和不理解二进制的人。


将十进制转换为二进制

1
2
3
function dec2bin(dec){  
  return (dec >>> 0).toString(2);
}


将二进制转换为十进制

1
2
3
function bin2dec(bin){  
  return parseInt(bin, 2).toString(10);
}