跳到主要内容

JavaScript 位运算符

提示
  1. 位运算符基础:JavaScript 位运算符处理 32 位二进制数,执行基本的二进制操作,结果以十进制显示。
  2. 常用位运算符:包括位与 &、位或 |、位异或 ^、位非 ~、左移 <<、带符号右移 >> 和无符号右移 >>>
  3. 运算符应用示例:位与用于对应位都为 1 时返回 1;位或对其中一个位为 1 时返回 1;位异或对不同位返回 1;位非将所有位取反;左移和右移分别向左或右移动位数,填充空位。

JavaScript 位运算符示意图

JavaScript 位运算符

位运算符将其操作数视为一组 32 位二进制数字(零和一),并执行操作。但是,结果以十进制值显示。

运算符名称示例
&位与(AND)x & y
``位或(OR)
^位异或(XOR)x ^ y
~位非(NOT)~x
<<左移x << y
>>带符号右移x >> y
>>>无符号右移x >>> y

注意:通过 32 位有符号数可表示的最小和最大整数是 -2147483648 到 2147483647。

JavaScript 位与运算

位与运算 & 当两个操作数的相应位都为 1 时返回 1,否则返回 0

操作数 1操作数 2与运算结果
000 & 00
010 & 10
101 & 00
111 & 11

让我们看一下两个整数 1225 的位与运算。

以二进制表示,

12 = 01100
25 = 11001

// 12 和 25 的位与运算

00001100
& 00011001
---------
00001000 = 8(十进制)

注意:将 12 转换为 32 位二进制,我们得到 0000000000000000000000000000110025 得到 00000000000000000000000000011001。但为了简化,我们省略了前导零。

示例 1:位与运算符

// 位与运算符示例

let a = 12;
let b = 25;

result = a & b;
console.log(result); // 8

在上面的程序中,

  • 12 的二进制值是 00000000000000000000000000001100
  • 25 的二进制值是 00000000000000000000000000011001
  • 当执行位与运算时,二进制结果为 00000000000000000000000000001000,转换为十进制值 8。

JavaScript 位或运算

位或运算 | 当其中一个操作数的相应位有一个为 1 时返回 1,否则返回 0

操作数 1操作数 2或运算结果
00`0
01`0
10`1
11`1

让我们看一下两个整数 1225 的位或运算。

以二进制表示,

12 = 01100
25 = 11001

// 12 和 25 的位或运算

00001100
| 00011001
--------
00011101 = 29(十进制)
```### 示例 2:位或运算符

```js exec
// 位或运算符示例
let a = 12;
let b = 25;

result = a | b;
console.log(result); // 29

当执行位或运算时,二进制结果为 00000000000000000000000000011101,转换为十进制值 29。

JavaScript 位异或运算

位异或运算 ^ 当相应位不同返回 1,相同则返回 0

操作数 1操作数 2异或运算结果
000 ^ 00
010 ^ 11
101 ^ 01
111 ^ 10
以二进制表示,

12 = 01100
25 = 11001

// 12 和 25 的位异或运算

00001100
^ 00011001
--------
00010101 = 21(十进制)

示例 3:位异或运算符

// 位异或运算符示例
let a = 12;
let b = 25;

result = a ^ b;
console.log(result); // 21

当执行位异或运算时,二进制结果为 00000000000000000000000000010101,转换为十进制值 21。

JavaScript 位非运算

位非运算 ~ 反转位(0 变成 11 变成 0)。

以二进制表示,

12 = 00000000000000000000000000001100

// 12 的位非运算

~ 00000000000000000000000000001100
---------------------------------
11111111111111111111111111110011 = -13(十进制)

11111111111111111111111111110011 转换为十进制时,值为 4294967283。但在使用位运算符时,值是按照带符号的 2 的补码格式计算的,除了无符号右移。

计算 2 的补码是通过反转位(1 的补码)然后加上 1。例如,

13 的二进制:00000000000000000000000000001101
131 的补码:11111111111111111111111111110010

132 的补码:11111111111111111111111111110010
+1
-----------------------------
11111111111111111111111111110011

注意 13 的 2 的补码(即 -13)是 11111111111111111111111111110011。这个值等同于 12 的位非运算结果。

示例 4:位非运算符

// 位运算非操作符示例
let b = 12;

result = ~b;

console.log(result); // -13

当进行位运算 操作时,二进制结果将是 11111111111111111111111111110011,转换成十进制值就是 -13。

注意:一个数 x 的位运算非结果是 -(x + 1)。注意上面 ~2 得到的是 -3。

JavaScript 左移运算

左移运算符 << 中,左操作数指定了数字,右操作数指定了要左移的位数。右侧添加零位,左侧多余的位将被丢弃。

JavaScript 左移运算的工作原理

例如,

let a = 8;
let b = 1;

result = a << b;

// 16 ( 00000000000000000000000000010000 )
console.log(result);

JavaScript 符号传播的右移运算

在右移运算符 >> 中,第一个操作数指定了数字,第二个操作数指定了要右移的位数。右侧多余的位将被丢弃。左侧最左边的位的副本会从左侧移入,因此得名符号传播。

JavaScript 中符号传播右填充的工作原理

例如,

let a = 8;
let b = 1;
// 11111111111111111111111111111101
let c = -3;

result = a >> b;
result1 = c >> b;

// 4 (00000000000000000000000000000100)
console.log(result);

// -2 (11111111111111111111111111111110)
console.log(result1);

JavaScript 零填充右移运算

零填充右移运算 >>> 将操作数向右移位,并在左侧填充零位。右侧多余的位将被丢弃。

JavaScript 中零填充右移的工作原理

例如,

let a = 8;
let b = 1;
let c = -3;

result = a >>> b;
result1 = c >>> b;

// 4 (00000000000000000000000000000100)
console.log(result);

// 1073741823 (00111111111111111111111111111111)
console.log(result);