逻辑与。如果两位均为 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 将数字存储为 64 位浮点数,但都是按位的 对 32 位二进制数执行运算。
在执行按位运算之前,JavaScript 将数字转换为 32 位 有符号整数。
执行按位运算后,结果被转换回 64 位 JavaScript 数字。
上面的示例使用 4 位无符号二进制数。因此 ~ 5 返回 10。
由于 JavaScript 使用 32 位有符号整数,因此它不会返回 10。它将返回 -6。
00000000000000000000000000000101 (5)
11111111111111111111111111111010 (~5=-6)
有符号整数使用最左边的位作为减号。
当对一对位进行按位与运算时,如果两个位都为 1,则返回 1。
0
0
0
1
0000
0001
0010
0100
当对一对位执行按位或时,如果其中一个位为 1,则返回 1:
0
1
1
1
1111
1111
1111
1111
当对一对位执行按位异或时,如果位不同则返回 1:
0
1
1
0
1111
1110
1101
1011
仅当两位均为 1 时,按位 AND 才返回 1:
00000000000000000000000000000101
00000000000000000000000000000001
00000000000000000000000000000001 (1)
let x = 5 & 1;
自己尝试一下→
<!DOCTYPE html>
<html>
<body>
<h1>JavaScript Bitwise AND</h1>
<h2>The & Operator</h2>
<p id="demo"></p>
<script>
document.getElementById("demo").innerHTML = 5 & 1;
</script>
</body>
</html>
如果其中一位为 1,则按位或返回 1:
00000000000000000000000000000101
00000000000000000000000000000001
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>
如果位不同,按位 XOR 返回 1:
00000000000000000000000000000101
00000000000000000000000000000001
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>
00000000000000000000000000000101
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>
这是零填充左移。从右侧推入一个或多个零位, 最左边的位脱落:
00000000000000000000000000000101
00000000000000000000000000001010 (10)
let x = 5 << 1;
自己尝试一下→
<!DOCTYPE html>
<html>
<body>
<h1>JavaScript Bitwise Left</h1>
<h2>The << Operator</h2>
<p id="demo"></p>
<script>
document.getElementById("demo").innerHTML = 5 << 1;
</script>
</body>
</html>
这是保留右移的标志。最左边位的副本被推送 从左边开始,最右边的位脱落:
11111111111111111111111111111011
11111111111111111111111111111101 (-3)
let x = -5 >> 1;
自己尝试一下 →
<!DOCTYPE html>
<html>
<body>
<h1>JavaScript Signed Bitwise Right</h1>
<h2>The >> Operator</h2>
<p id="demo"></p>
<script>
document.getElementById("demo").innerHTML = -5 >> 1;
</script>
</body>
</html>
这是零填充右移。从左侧推入一个或多个零位, 最右边的位脱落:
00000000000000000000000000000101
00000000000000000000000000000010 (2)
let x = 5 >>> 1;
自己尝试一下→
<!DOCTYPE html>
<html>
<body>
<h1>JavaScript Unsigned Bitwise Right</h1>
<h2>The >>> Operator</h2>
<p id="demo"></p>
<script>
document.getElementById("demo").innerHTML = 5 >>> 1;
</script>
</body>
</html>
仅设置一位的二进制数很容易理解:
1
2
4
8
16
32
64
再设置几个位即可揭示二进制模式:
5(4 + 1)
13 (8 + 4 + 1)
45 (32 + 8 + 4 + 1)
JavaScript 二进制数以二进制补码格式存储。
这意味着负数是该数加 1 的按位 NOT:
5
-5
6
-6
40
-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>