JavaScript 按位运算符

JavaScript 按位运算符将它的操作数转为长度为 32 位的二进制串(0 和 1 组成)进行计算,位运算的结果是标准的 JavaScript 数值。

JavaScript 按位运算符将它的操作数转为长度为 32 位的二进制串(0 和 1 组成)进行计算,位运算的结果是标准的 JavaScript 数值。

JavaScript 按位运算符

运算符 名称 用法 说明
& 按位与 a & b 在 a, b 的位表示中,每一个对应的位,两个都为 1 则返回 1, 否则返回 0。
| 按位或 a | b 在 a, b 的位表示中,每一个对应的位,只要有一个为 1 则返回 1, 否则返回 0。
^ 按位异或 a ^ b 在 a, b 的位表示中,每一个对应的位,两个不相同则返回 1,相同则返回 0。
~ 按位非 ~ a 反转被操作数的位。
<< 左移 a << b 将 a 的二进制串向左移动 b 位,右边移入 0。
>> 算术右移 a >> b 把 a 的二进制表示向右移动 b 位,丢弃被移出的所有位。算术右移左边空出的位是根据最高位是 0 和 1 来进行填充的。
>>> 无符号右移 a >>> b 把 a 的二进制表示向右移动 b 位,丢弃被移出的所有位,并把左边空出的位都填充为 0。

JavaScript 位运算原理

JavaScript 将数字存储为 64 位浮点数,但所有按位运算都是在 32 位二进制数上执行的。

在执行按位运算之前,JavaScript 将十进制数字转换为 32 位有符号二进制整数。执行按位运算后,再把结果转换回 64 位 JavaScript 数字。

我们逐步来运算一下 5 & 1 的逻辑与运算。

5 的二进制数是 101,通过左边补 0 转为 32 位的二进制为:

00000000000000000000000000000101

同样,1 的二进制数为:

00000000000000000000000000000001

然后逐位的进行运算, 逻辑与的规则是 两位都为 1 返回 1 ,否则返回 0, 根据规则,两个数的最后一位都为 1,才返回 1,其他位都是 0:

00000000000000000000000000000101
00000000000000000000000000000001
--------------------------------
00000000000000000000000000000001

00000000000000000000000000000001 是二进制,转为十进制数是 1

那么 5 & 1 = 1

JavaScript 按位与 (&)

按位与计算规则:在 a, b 的位表示中,每一个对应的位,两个都为 1 则返回 1, 否则返回 0。

运算示例:

运算 结果 运算 结果
0 & 0 0 1111 & 0000 0000
0 & 1 0 1111 & 0001 0001
1 & 0 0 1111 & 0010 0010
1 & 1 1 1111 & 0100 0100

计算 5 & 1

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

JavaScript 按位与代码示例:

let x = 5 & 1;
console.log("x =", x); // 输出 x = 1

JavaScript 按位或 (|)

JavaScript 按位或计算规则:在 a, b 的位表示中,每一个对应的位,只要有一个为 1 则返回 1, 否则返回 0。

运算示例:

运算 结果 运算 结果
0 | 0 0 1111 | 0000 1111
0 | 1 1 1111 | 0001 1111
1 | 0 1 1111 | 0010 1111
1 | 1 1 1111 | 0100 1111

计算 5 | 1

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

JavaScript 按位或代码示例:

let x = 5 | 1;
console.log("x =", x); // 输出 x = 5

JavaScript 按位异或 (^)

JavaScript 按位异或计算规则:在 a, b 的位表示中,每一个对应的位,两个不相同则返回 1,相同则返回 0。

运算示例:

运算 结果 运算 结果
0 ^ 0 0 1111^0000 1111
0 ^ 1 1 1111^0001 1110
1 ^ 0 1 1111^0010 1101
1 ^ 1 0 1111^0100 1011

计算 5 ^ 1

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

JavaScript 按位异或代码示例:

let x = 5 ^ 1;
console.log("x =", x); // 输出 x = 4

JavaScript 按位非 (~)

JavaScript 按位非计算规则:反转被操作数的位。

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

JavaScript 按位非代码示例:

let x = ~5;
console.log("x =", x); // 输出 x = -6

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

JavaScript(零填充)按位左移 a << b 计算规则: 将 a 的二进制串向左移动 b 位,右边移入 0。

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

JavaScript(零填充)按位左移代码示例:

let x = 5 << 1;
console.log("x =", x); // 输出 x = 10

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

JavaScript(符号保留)按位右移 a >> b 计算规则: 把 a 的二进制表示向右移动 b 位,丢弃被移出的所有位。算术右移左边空出的位是根据最高位是 0 和 1 来进行填充的。

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

JavaScript(符号保留)按位右移代码示例:

let x = -5 >> 1;
console.log("x =", x); // 输出 x = -3

JavaScript 无符号右移 (>>>)

JavaScript(无符号右移 a >>> b 计算规则:把 a 的二进制表示向右移动 b 位,丢弃被移出的所有位,并把左边空出的位都填充为 0。

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

JavaScript 无符号右移代码示例:

let x = 5 >>> 1;
console.log("x =", x); // 输出 x = 2

十进制转二进制

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

二进制转十进制

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