详解js中的!~

在阅读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 则为1011101058

运算

下面的公式可快速转换

~x = -(x + 1)


文章作者: 徐辉波
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 徐辉波 !
评论
 上一篇
winscp普通用户上传文件没有权限解决 winscp普通用户上传文件没有权限解决
winscp可以利用sftp协议对linux服务器就行连接,如果是利用普通用户进行登陆的话,上传文件的过程中会出现一些permission denied的提示,并且错误的返回码是3,下面说明下解决方法。 查看sftp应用程序的路径
2018年10月20日
下一篇 
Git基本操作 Git基本操作
下载远程仓库到本地 git clone resp [name] 切换分支 git checkout develop 新建分支 git checkout -b feature/xhb-test 文件状态 git status 仓库初始化 g
2018年10月17日
  目录