位操作
- 最底层上的操作,js中所有数值都以IEEE-754-64位格式存储
- 位操作,会先将64位数值,转换为32位整数,再执行操作,结果再转换为64位
- 对于有符号数,最后一位表示数值的符号位
- 负数是以二进制补码的形式存储的,求补码规则
- 先求这个数值绝对值的二进制码
- 再对该二进制码取反,称为反码
- 得到的反码再加1,即可得到补码
- 默认情况下,es中所有的整数都是有符号整数
- 64位转换位32位过程,会导致一个严重的副效应,对于特殊的NaN、undefined和Infinity应用位操作时,都会被当成0来处理
- 对于非数值采用位操作,会先用Number()函数来转换
按位非 ~
- 返回数值的反码,每一位取反
- number的反码位也可以用 -number-1取得,但非表示在最底层执行操作,速度更快
按位与 &
- 将两个操作数每一位进行按位与运算
按位或 |
- 将两个操作数每一位进行按位或运算
按位异或 ^
- 两个操作数的每一位相同为0,不同为1
- 任何数与0异或都是它本身,该数的每一位与1异或则是取反
移位操作
- 左移 << ,每左移一位相当于 *2
- 有符号的右移>>,最高位补符号位,与左移恰好相反,每右移一位相当于 / 2取整。
- 无符号右移 >>> ,最高为补0