位运算符
位运算分为两种,位逻辑运算符与位移运算符。
js 中,位运算符包括7种:按位非(NOT)、按位与(AND)、按位或(OR)、按位异或(XOR)、左移、有符号右移、无符号右移。
JavaScript 将数字存储为 64 位浮点数,但所有按位运算都以 32 位二进制数执行。
在执行位运算之前,JavaScript 将数字转换为 32 位有符号整数。
执行按位操作后,结果将转换回 64 位 JavaScript 数。
1、& 按位与
&是二元运算符,它以特定的方式的方式组合操作数中对应的位,如果对应的位都为1,那么结果就是1, 如果任意一个位是0 则结果就是0。
1 & 3的结果为1
那我们来看看他是怎么运行的
1的二进制表示为0 0 0 0 0 0 0 1
3的二进制表示为0 0 0 0 0 0 1 1
console.log(1&3);
比较二进制上对应位置的数,发现1和3,只有最后一位都是1,所以二进制比较的结果是:0000 0001,转化为十进制为1。
小技巧:使用&运算符判断一个数的奇偶
可以用一个数和1进行按位&操作来判断其奇偶性,比如 num&1,若为1,则num是奇数;若为0,则num是偶数。
2、| 按位或
|运算符跟&的区别在于如果对应的位中任一个操作数为1 那么结果就是1。
4的二进制表示为0 0 0 0 0 1 0 0
3的二进制表示为0 0 0 0 0 0 1 1
console.log(4 | 3);
4 | 3的结果为7。
按照按位或的规则,4|3的二进制结果是0 0 0 0 1 1 1 ,转换为10进制,最后结果是7
小技巧:使用|来向下取整
可以用一个数和0进行(|)|按位或操作来向下取整,比如 3.14 | 0= 3。
console.log(3.14 | 0);
3、^ 按位异或
^运算符跟|类似,但是还是有点不同。两个数值的对应位只有一个为1时结果才是1,否则为0。
4的二进制表示为0 0 0 0 0 1 0 0
3的二进制表示为0 0 0 0 0 0 1 1
console.log( 4^0 3);
console.log(12^0)
console.log(1.3^0)
所以 4 ^ 3的结果为0 0 0 0 1 0 1,转化为十进制,所以最后结果是5。
“异或运算”有一个常见运用:
连续对两个数a和b进行三次异或运算(aˆ=b;bˆ=a; aˆ=b;),可以互换它们的值。
此外,整数与整数本身按位异或得到的是0(因为每两个对应的数字都相同,所以最后返回的都是0)。
整数与0按位异或得到的是其本身,小数与0按位异或可以取整。
整数^0=整数本身
小数^0=整数
4、~否运算
~运算符是对位求反,1变0,0变1,也就是求二进制的反码。(反转所有位)
consol.log(~1);
1的二进制表示为 0 0 0 0 0 0 1
所以 ~1 的结果是-2
5、<< 左移
通过从右推入零向左位移,并使最左边的位脱落。对于其移动规则只需记住丢弃最高位,0补最低位即按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
console.log(5<<2);
5的二进制表示为 0 0 0 0 0 1 0 1
将5的二进制向左推动2个位子,补上2个0,得到0 0 0 1 0 1 0 0,转化为十进制,最后得到的结果就是20。
6、>> 右移
通过从左推入最左位的拷贝来向右位移,并使最右边的位脱落。对于其移动规则只需记住符号位不变,左边补上符号位即按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。
console.log(3>>1);
3的二进制表示为 0 0 0 0 0 0 1 1
将5的二进制向左推动2个位子0 0 0 0 0 0 0 1 ,并补上1个0,得到,转化为十进制,最后得到的结果就是1。