在阅读hexo和vant的源码时,很容易看到这样的代码
// hexo
Promise.filter(publicFiles, path => !~routeList.indexOf(path)).map(deleteFile)
// vant
const intallList = exportList.filter(name => !~uninstallComponents.indexOf(uppercamelize(name)))
含义
~表示按二进制位取反
3=00000011,那~3=101101=4
概念:
- 原码
原码表示法最高位为符号位,该位为0表示正数,1表示负数。其余位表示数的绝对值
- 反码
对于一个带符号的数来说,正数的反码与其原码相同;负数的反码为其原码除符号位以外的各位按位取反。反码常用来做求补码过程中的中间形式。
- 补码
正数的补码与其原码和反码相同;负数的补码是对它的原码除符号位以外各位取反,并在末位加1而得到,即为该数的补码加1。计算机内的数一般以补码形式表示。在补码中用(-128)D代替了(-0)D,注意:(-128)D没有相对应的原码和反码,(-128)D = (1000,0000)B。
- 求补运算
求补运算不考虑符号位,对它的原码各位取反,并在末位加1而得到。对一个数进行求补运算所得的是该数相反数的补码
示例
~57 = 58
- 57的二进制:00111001
- 按位取反后: 11000110,即:-70
这是一个负数,是有符号的数,负数在计算机里要用其补码来表示:补码=符号位以后按位取反再加1.
- 取补码为:11000110符号位以后按位取反后为10111001 再加1 则为10111010即58
运算
下面的公式可快速转换
~x = -(x + 1)