Javascript 简明教程

JavaScript - Bitwise Operators

JavaScript Bitwise Operators

JavaScript 中的按位运算符在二进制级别对整数值执行操作。它们用于操作整数值的各个位。按位运算符类似于逻辑运算符,但它们对单个位起作用。

JavaScript 按位运算符对 32 位操作数起作用。在 JavaScript 中,数字以 64 位浮点数形式存储。JavaScript 在执行操作之前将数字转换为 32 位带符号整数。在按位操作之后,它将结果转换为 64 位数字。

JavaScript 中有七个按位运算符。以下是包含描述的按位运算符列表。

Operator

Name

Description

&

Bitwise AND

如果两个位都是 1,则返回 1,否则返回 0。

Bitwise OR

如果任一位是 1,则返回 1,否则返回 0。

^

Bitwise XOR

如果两个位都不同,则返回 1,否则返回 0。

!

Bitwise NOT

如果位是 0,则返回 1,否则返回 0。

<<

Left Shift

通过从右侧压入零并丢弃最左侧的位来向左移动位。

>>

Right Shift

通过从左侧压入最左侧位的副本并丢弃最右侧的位来向右移动位。

>>>

Right Shift with Zero

JavaScript Bitwise AND (&) Operator

bitwise AND (&) 运算符对其整数运算符的每一对位执行 AND 运算。运算后,它返回一个更新了位的新的整数。

当按位 AND 运算符应用于一对位时,如果两个位都是 1,则返回 1,否则返回 0。

以下是按位 AND 运算的真值表 −

A

B

A & B

0

0

0

0

1

0

1

0

0

1

1

1

让我们以 4 位运算符为例了解按位 AND 运算。

A

B

A & B

1111

0001

0001

1111

0010

0010

1111

0100

0100

1111

1000

1000

Example

让我们对 5 和 7 执行按位 AND (&) 运算。这些数字表示为 32 位整数。

Decimal Number

Binary Equivalent (32-bits)

5

00000000000000000000000000000101

7

00000000000000000000000000000111

5 & 7

00000000000000000000000000000101 (= 5)

二进制数 101 和 111 的每一位的或运算的结果值相同,如下所示。

  1. 1 & 1 = 1

  2. 1 & 0 = 0

  3. 1 & 1 = 1

所以,结果二进制数是 111,它等于十进制表示中的 7。

<html>
<body>
<div id="output"></div>
<script>
  const a = 5;
  const b = 7;
  document.getElementById("output").innerHTML = "a & b = " + (a & b);
</script>
</body>
</html>

它将产生以下结果 −

a & b = 5

JavaScript Bitwise OR (|) Operator

按位 OR (|) 运算符对其整数运算符的每一对位执行 OR 运算。运算后,它返回一个更新了位的整数。

当按位 OR 运算符应用于一对位时,如果任一位是 1,则返回 1,否则返回 0。

以下是按位 OR 运算的真值表。

A

B

A

B

0

0

0

0

1

1

1

0

1

1

1

1

让我们以 4 位操作数为例来了解按位 OR 运算。

A

B

A

B

1111

0001

1111

1111

0010

1111

1111

0100

1111

1111

1000

1111

Example

我们对 5 和 7 执行按位 OR (|) 运算。这些数字表示为 32 位整数。

Decimal Number

Binary Equivalent (32-bits)

5

00000000000000000000000000000101

7

00000000000000000000000000000111

5

7

二进制数 101 和 111 的每一位的或运算的结果值相同,如下所示。

  1. 1 | 1 = 1

  2. 1 | 0 = 1

  3. 1 | 1 = 1

所以,结果二进制数是 111,它等于十进制表示中的 7。

<html>
<body>
<div id="output"></div>
<script>
  const a = 5;
  const b = 7;
  document.getElementById("output").innerHTML = "a | b = " + (a | b);
</script>
</body>
</html>

它将产生以下结果 −

a | b = 7

JavaScript Bitwise XOR (^) Operator

按位异或 (^) 运算符对其整数操作数的每对位执行异或运算。运算后,它返回一个具有更新位的新整数。

当对一对位应用按位异或运算符时,如果两个位不同则返回 1,否则返回 0。

以下是按位异或运算的真值表 -

A

B

A ^ B

0

0

0

0

1

1

1

0

1

1

1

0

Example

让我们对 5 和 7 执行按位异或 (^) 运算。

Decimal Number

Binary Equivalent (32-bits)

5

00000000000000000000000000000101

7

00000000000000000000000000000111

5 ^ 7

00000000000000000000000000000010 (= 2)

执行 101 和 111 的按位异或运算后,得到以下的结果二进制数。

  1. 1 ^ 1 = 0

  2. 1 ^ 0 = 1

  3. 1 ^ 1 = 0

因此,结果二进制数是 010,等于 2。

<html>
<body>
<div id="output"></div>
<script>
  const a = 5;
  const b = 7;
  document.getElementById("output").innerHTML = "a ^ b = " + (a ^ b);
</script>
</body>
</html>

它将生成如下输出:

a ^ b = 2

JavaScript Bitwise NOT (~) Operator

按位非(~)运算符对二进制数的每一位执行非运算。它是一个一元运算符,它对二进制数的每一位取反,并返回二进制数的 2 的补码。

以下是按位异或运算的真值表。

Input (A)

Output (~A)

0

1

1

0

Example

让我们执行按位非(~)运算。

Decimal Number

Binary Equivalent (32-bits)

5

00000000000000000000000000000101

7

00000000000000000000000000000111

~5

11111111111111111111111111111010 (= -6)

~7

11111111111111111111111111111000 (= -8)

尝试执行下面的代码 -

<html>
<body>
<div id="output"></div>
<script>
  const a = 5;
  const b = 7;
  document.getElementById("output").innerHTML =
  "~a = " + (~a) + "<br>" +
  "~b = " + (~b)
</script>
</body>
</html>

它将生成如下输出:

~a = -6
~b = -8

Bitwise Left Shift (<<) Operator

JavaScript 按位左移 (<<) 运算符将其第一个操作数中的所有位向左移动,位数由第二个操作数指定。用 0 填充新的位,丢弃最左位。

将值左移一位相当于将其乘以 2,左移两位相当于乘以 4,依此类推。

Example

当你将 5(101)左移 1 位时,值变为 10(1010)。当你对 2 位执行左移操作时,结果值是 20(10100)。

Decimal Number

Binary Equivalent (32-bits)

5

00000000000000000000000000000101

5 << 1

00000000000000000000000000001010 (= 10)

5 << 2

00000000000000000000000000010100 (= 20)

以下 JavaScript 程序演示位移左移操作 −

<html>
<body>
<div id="output"></div>
<script>
  const a = 5;
  document.getElementById("output").innerHTML =
  "a << 1 = " + (a << 1) + "<br>" +
  "a << 2 = " + (a << 2);
</script>
</body>
</html>

它将生成如下输出:

a << 1 = 10
a << 2 = 20

Bitwise Right Shift (>>) Operator

位移右移 (>>) 运算符将第一个操作数中的所有位向右移动指定的第二个操作数位数。它从左插入最靠左的位副本并丢弃最靠右的位。以这种方式,它保留数字的符号。

简而言之,它从数字中删除 N 个最后一位。此处,N 是第二个操作数。右移二进制数相当于将十进制数除以 2。

Example

在下例中,当我们第一次对 101 执行右移操作时,a 的值变为 010。在执行右移操作第二次后,得到的结果值是 001,在十进制表示法中等于 1。

Decimal Number

Binary Equivalent (32-bits)

5

00000000000000000000000000000101

5 >> 1

00000000000000000000000000000010 (= 2)

~5

11111111111111111111111111111010 (= -6)

~5 >>1

11111111111111111111111111111101 (= -3)

尝试执行以下程序 −

<html>
<body>
<div id="output"></div>
<script>
  const a = 5;
  document.getElementById("output").innerHTML =
  "a >> 1 = " + (a >> 1) + "<br>" +
  "~a >> 1 = " + (~a >> 1);
</script>
</body>
</html>

它将生成如下输出:

a >> 1 = 2
~a >> 1 = -3

Bitwise Right Shift with Zero (>>>) Operator

使用零的右移 (>>>) 运算符与右移运算符非常相似。它始终用零填充左位,而不必担心位的符号。

Example

此处,10 的二进制表示形式为 1010。当我们使用零执行右移操作时,它向右移动所有位 2 次,并在开头插入两个 0。因此,得到的结果值将是 0010,等于 1。

Decimal Number

Binary Equivalent (32-bits)

5

00000000000000000000000000000101

5 >>> 1

00000000000000000000000000000010 (= 2)

以下 JavaScript 程序演示如何使用 >>> 运算符。

<html>
<body>
<div id="output"></div>
<script>
  const a = 5;
  document.getElementById("output").innerHTML = "a >>> 1 = " + (a >>> 1);
</script>
</body>
</html>

它将产生以下结果 −

a >>> 1 = 2

您可能尝试对每个运算符使用不同的输入并观察输出以获取更多实践。