JavaScript 按位


目录

    显示目录


JavaScript 位运算符

&

逻辑与。如果两位均为 1,则将每位设置为 1

|

逻辑或。如果两位中有一位为 1,则将每位设置为 1

^

逻辑异或。如果两位中只有一位为 1,则将每位设置为 1

~

逻辑非。反转所有位

<<

零填充左移。通过从右侧推入零来向左移动,并让最左边的位脱落

>>

有符号右移。通过从左侧推入最左边位的副本来右移,并让最右边的位 脱落

>>>

零填充右移。通过从左侧推入零来右移,并让最右边的位脱落

例子

Operation Result Same as Result
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 按位与

当对一对位进行按位与运算时,如果两个位都为 1,则返回 1。

0 & 0

0

0 & 1

0

1 & 0

0

1 & 1

1

1111 & 0000

0000

1111 & 0001

0001

1111 & 0010

0010

1111 & 0100

0100


JavaScript 按位或

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

0 | 0

0

0 | 1

1 | 0

1

1 | 1

1

1111 | 0000

1111

1111 | 0001

1111

1111 | 0010

1111

1111 | 0100

1111


JavaScript 按位异或

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

0 ^ 0

0

0 ^ 1

1 ^ 0

1

1 ^ 1

1111 ^ 0000

1111

1111 ^ 0001

1110

1111 ^ 0010

1101

1111 ^ 0100

1011


JavaScript 按位与 (&)

仅当两位均为 1 时,按位 AND 才返回 1:

5

00000000000000000000000000000101

1

00000000000000000000000000000001

5 & 1

00000000000000000000000000000001 (1)

例子

let x = 5 & 1;

自己尝试一下→

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Bitwise AND</h1>
<h2>The &amp; Operator</h2>

<p id="demo"></p>

<script>
document.getElementById("demo").innerHTML = 5 & 1;
</script>

</body>
</html> 

JavaScript 按位或 (|)

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

5

00000000000000000000000000000101

1

00000000000000000000000000000001

5 | 1

00000000000000000000000000000101 (5)

例子

let x = 5 | 1;

自己尝试一下→

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Bitwise OR</h1>
<h2>The | Operator</h2>

<p id="demo"></p>

<script>
document.getElementById("demo").innerHTML = 5 | 1;
</script>

</body>
</html>

JavaScript 按位异或 (^)

如果位不同,按位 XOR 返回 1:

5

00000000000000000000000000000101

1

00000000000000000000000000000001

5 ^ 1

00000000000000000000000000000100 (4)

例子

let x = 5 ^ 1;

自己尝试一下→

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Bitwise XOR</h1>
<h2>The ^ Operator</h2>

<p id="demo"></p>

<script>
document.getElementById("demo").innerHTML = 5 ^ 1;
</script>

</body>
</html>

JavaScript 按位非 (~)

5

00000000000000000000000000000101

~5

11111111111111111111111111111010 (-6)

例子

let x = ~5;

自己尝试一下→

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Bitwise NOT</h1>
<h2>The ~ Operator</h2>

<p id="demo"></p>

<script>
document.getElementById("demo").innerHTML = ~ 5;
</script>

</body>
</html>

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

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

5

00000000000000000000000000000101

5 << 1

00000000000000000000000000001010 (10)

例子

let x = 5 << 1;

自己尝试一下→

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Bitwise Left</h1>
<h2>The &lt;&lt; Operator</h2>

<p id="demo"></p>

<script>
document.getElementById("demo").innerHTML = 5 << 1;
</script>

</body>
</html>

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

这是保留右移的标志。最左边位的副本被推送 从左边开始,最右边的位脱落:

-5

11111111111111111111111111111011

-5 >> 1

11111111111111111111111111111101 (-3)

例子

let x = -5 >> 1;

自己尝试一下 →

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Signed Bitwise Right</h1>
<h2>The &gt;&gt; Operator</h2>

<p id="demo"></p>

<script>
document.getElementById("demo").innerHTML = -5 >> 1;
</script>

</body>
</html>

JavaScript(零填充)右移 (>>>)

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

5

00000000000000000000000000000101

5 >>> 1

00000000000000000000000000000010 (2)

例子

let x = 5 >>> 1;

自己尝试一下→

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Unsigned Bitwise Right</h1>
<h2>The &gt;&gt;&gt; Operator</h2>

<p id="demo"></p>

<script>
document.getElementById("demo").innerHTML = 5 >>> 1;
</script>

</body>
</html>

二进制数

仅设置一位的二进制数很容易理解:

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 二进制数以二进制补码格式存储。

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

00000000000000000000000000000101

5

11111111111111111111111111111011

-5

00000000000000000000000000000110

6

11111111111111111111111111111010

-6

00000000000000000000000000101000

40

11111111111111111111111111011000

-40

玩笑 :

世界上只有10种人:懂二进制的人和不懂二进制的人。


将十进制转换为二进制

例子

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

自己尝试一下 →

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Convert Decimal to Binary</h1>

<p id="demo"></p>

<script>
document.getElementById("demo").innerHTML = dec2bin(-5);
function dec2bin(dec){
  return (dec >>> 0).toString(2);
}
</script>

</body>
</html>

将二进制转换为十进制

例子

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

自己尝试一下 →

<!DOCTYPE html>
<html>
<body>

<h2>JavaScript Convert Binary to Decimal</h2>

<p id="demo"></p>

<script>
document.getElementById("demo").innerHTML = bin2dec(101);
function bin2dec(bin){
  return parseInt(bin, 2).toString(10);
}
</script>

</body>
</html>