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);
}