一 位运算符预览
| 符号 | 中文 | 含义 | 类型 |
|---|---|---|---|
& | 按位与 | 二进位相与 | 双目运算符 |
| | 按位或 | 二进位相或 | 双目运算符 |
^ | 按位异或 | 二进位相异 | 双目运算符 |
~ | 按位取反 | 二进位按位取反 | 单目运算符 |
<< | 按位左移 | 二进位向左移动n位 | 双目运算符 |
>> | 按位右移 | 二进制向右移动n位 | 双目运算符 |
二 双目运算符
1. 按位与(&)
- 解析
9 & 5 => 1
00001001
&
00000101
=>
00000001
# 仅当对应的两个二进制位均为1时,结果才为1.
2. 按位或(|)
- 解析
9 | 5 => 13
00001001
&
00000101
=>
00001101
# 只要对应的两个二进制位其中一个是1,结果就是1.
- 应用于JS
9 | 0 => 9
00001001
&
00000000
=>
00001001
// 看起来没啥用,其实可以用来向下取整
9.5 | 0
相当于
Math.floor(9.5)
3. 按位异或(^)
- 解析
9 ^ 5 => 12
00001001
^
00000101
=>
00001100
# 只要对应的两个二进制不同,结果就是1.
- 应用于JS
9 ^ 9 => 0
00001001
^
00001001
=>
00000000
// 可以用作等值校验
9 === 9
// 相当于
!(9 ^ 9)
4. 按位左移(<<)
- 解析
# 注意: 左右指的是尖角的方向.
9<<1 => 18
00001001 9
00010010 18
# 二进位向左移动若干位.
- 应用于JS
9 << 1
// 相当于
Math.floor(9*(2**1))
// 于是
x << n
// 相当于
Math.floor(x*(2**n))
5. 按位右移(>>)
- 解析
# 注意: 左右指的是尖角的方向.
9<<1 => 18
00001001 9
00000100 4
# 二进位向右移动若干位.
- 应用于JS
9 >> 1
// 相当于
Math.floor(9/(2**1))
// 于是
x >> n
// 相当于
Math.floor(x/(2**n))
三 单目运算符
1. 按位取反(~)
- 解析
~ 9
~ (1001) => 0110
- 应用于JS
注意: 在ECMASCript
整数中有两种类型,即有符号整数和无符号整数.有符号整数使用31位表示整数的数值,用第32位表示整数的符号.第32位,0表示正数,1表示负数.
18
// `JS32位有符号整数中18的二进制`
0000 0000 0000 0000 0000 0000 0001 0010
// `JS32位有符号整数中18的二进制`的反码
1111 1111 1111 1111 1111 1111 1110 1101
// 第32位为1,所以是负数.
// 31位的0可以看成是1,1可以看成是0.
// -18
// `JS32位有符号整数中18的二进制`的反码 + 1
1111 1111 1111 1111 1111 1111 1110 1110
// +1 始终是按照正数的方式加的
// -17
// 我们可以简单认为:
~18 => -(18 + 1) => -19
~x => -(x + 1)