位运算符(JS)

337 阅读3分钟

一 位运算符预览

符号中文含义类型
&按位与二进位相与双目运算符
|按位或二进位相或双目运算符
^按位异或二进位相异双目运算符
~按位取反二进位按位取反单目运算符
<<按位左移二进位向左移动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)