1、操作符非(~)
var num = 7;
var num2 = ~num;
alert(num2); // -8
var num3 = -1;
var num4 = ~num3;
alert(num4); // 0
可以看出:~ 就是将原来的数值加1后取负, 即: ~x = -(x + 1)。
1.1、底层原理
先了解一下基本知识
1、计算机里的数字是以补码的形式表示的。
2、取反即:0变1,1变0。
3、第一个数为符号位,0为正数,1为负数。
4、正数的原码、反码、补码都一样。
5、负数的反码:符号位不变,其余取反。补码:反码加1。
6、0的反码补码都为0。
~即对当前数取反所表示的值。计算机中数字以补码形式表示,7的取反正好是-8的补码,所以~7 == -8;
1.2、用途:
1.2.1、取整数随机数
~~(Math.random()*7); // 在0~6内取整数随机数,包括0和6
~(Math.random()*7); // 在-7~-1内取整数随机数,包括-7和-1
-~(Math.random()*7); // 在1~7内取整数随机数,包括1和7
1.2.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
2.1、原理
1&1=1、1&0=0、0&1=0、0&0=0。根据规则对补码处理:
25 & 7
25 & -7
-25 & 7
-25 & -7
红 & 红 == 绿 绿 == 最后一行的数的补码
2.2、用途:
判断奇偶 !!(num & 1) 奇数为true
!!(7 & 1) // true
!!(4 & 1) // false
3、按位或 |
3.1、原理
1|1=1、1|0=1、0|1=1、0|0=0。
3.2、用途:取整
1.2 | 0 // 1
-7.8 | 0 // -7
4、按位异 ^
4.1、原理
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));