1、操作符非(~)
var num = 7;
var num2 = ~num;
alert(num2); // -8
var num3 = -1;
var num4 = ~num3;
alert(num4); // 0
可以看出:~ 就是將原來的數值加1后取負, 即: ~x = -(x + 1)。
底層原理:
先了解一下基本知識
1、計算機里的數字是以補碼的形式表示的。
2、取反即:0變1,1變0。
3、第一個數為符號位,0為正數,1為負數。
4、正數的原碼、反碼、補碼都一樣。
5、負數的反碼:符號位不變,其余取反。補碼:反碼加1。
6、0的反碼補碼都為0。
~即對當前數取反所表示的值。計算機中數字以補碼形式表示,7的取反正好是-8的補碼,所以~7 == -8;
用途:
1)、取整數隨機數
~~(Math.random()*7); // 在0~6內取整數隨機數,包括0和6
~(Math.random()*7); // 在-7~-1內取整數隨機數,包括-7和-1
-~(Math.random()*7); // 在1~7內取整數隨機數,包括1和7
2)、解決抽象滲漏
抽象滲漏:在代碼中暴露底層實現的細節。
對於indexOf判斷是否存在,像>-1、!=-1、>=0、<0之類細節就應該屏蔽掉
那么用~就很好解決了
var str = 'hello World';
if(~str.indexOf('ell'))
return true;
else
return false;
2、按位與&
var num1 = 25 & 7;
var num2 = 25 & -7;
var num3 = -25 & 7;
var num4 = -25 & -7;
alert(num1); // 1
alert(num2); // 25
alert(num3); // 7
alert(num4); // -31
原理:1&1=1、1&0=0、0&1=0、0&0=0。
根據規則對補碼處理:
25 & 7
25 & -7
-25 & 7
-25 & -7
紅 & 紅 == 綠 綠 == 最后一行的數的補碼
3、按位或 |
原理:1|1=1、1|0=1、0|1=1、0|0=0。
例子: 參考上面的。
4、按位異 ^
原理:1^1=0、1^0=1、0^1=1、0^0=0。
例子: 參考上面的。
5、左移 << 、右移 >> 、無符號右移 >>>
簡單記法:(a << b) === Math.ceil(a*(2**b));
(a >> b) === Math.floor(a/(2**b));