js中的按位取反运算符~


一、运算符~

  JS按位取反运算符~,是对一个表达式执行位非(求非)运算。如~1 = -2,~-3=2,~true=-2,~false=-1

二、如何按位取反计算

  按位取反的运算规则步骤:

  1、十进制转成原码

  转成二进制原码,最高位是符号位,0为正数,1为负数

 十进制 ----> 原码
      1 ----> 00000001
     -1  ----> 10000001

  2、原码转成反码

  正数的反码就是原码,负数的反码是符号位不变,其余位取反

 十进制 ----> 原码 ----> 反码
      1 ----> 00000001 ----> 00000001
     -1 ----> 10000001 ----> 11111110

  3、反码转成补码

  正数的补码还是原码,负数的补码是在反码的基础上加1

 十进制 ----> 原码 ----> 反码 ----> 补码
      1 ----> 00000001 ----> 00000001 ----> 00000001
     -1 ----> 10000001 ----> 11111110 ----> 11111111

  4、补码取反得原码

  正整数补码取反之后符号位置为1,是一个负整数,所以再按照负整数计算补码的方式逆运算得到原码

  逆运算得到原码,首先将取反的补码转成反码,公式:反码=补码 - 1,然后将反码转成原码,符号位不变,其他位取反

 十进制 ----> 原码 ----> 反码 ----> 补码 ----> 补码取反 ----> 取反补码转成反码  ----> 转成原码
    1   ----> 00000001 ----> 0000001 ----> 00000001 ----> 11111110 ---->   11111101   ----> 10000010

  负整数补码取反之后符号位置为0,是一个正整数,因正整数的反码与补码就是本身,所以不需要再进行逆运算

 十进制 ---->  原码 ----> 反码 ----> 补码 ----> 补码取反得原码  
    -1  ----> 10000001 ----> 11111110 ----> 11111111 ---->   00000000  

  5、将原码转成二进制

 十进制 ----> 原码 ----> 反码 ----> 补码  ----> 补码取反  ----> 取反补码转成反码  ----> 转成原码  ----> 转成二进制
    1   ----> 00000001 ----> 0000001 ----> 00000001 ----> 11111110 ---->   11111101   ----> 10000010 ----> -2
 十进制 ----> 原码 ----> 反码 ----> 补码  ---->  补码取反得原码  ----> 转成二进制
    -1  ----> 10000001 ----> 11111110  ----> 11111111  ----> 00000000 ----> 0

  所以,~1=-2,~-1=0

三、使用 ~ 和!的区别

  findIndex是查询是否在数组中,存在则返回索引,不存在返回-1,通过~取反,得到的效果与使用!相同,但是两者返回的值不同。

  ~ 返回的是一个整数类型

  !返回的是一个boolean类型

 let arr = [1,2,3,4,5];
 console.log(~arr.findIndex(d=>d===1)?'1存在':'1不存在');  //1存在
 console.log(~arr.findIndex(d=>d===6)?'6存在':'6不存在');   //6不存在
console.log(~arr.findIndex(d=>d===6))      //0
console.log(!arr.findIndex(d=>d===6))      //false

四、取反再取反~~的作用

  操作符~, 是按位取反的意思,表面上~~(取反再取反)没有意义,实际上在JS中可以将浮点数变成整数

 console.log(~~1.11);         //1
 console.log(~~-25.11);       //-25

 

  


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM