一、運算符~
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