js位操作
1.&(与)
都是1才是1
例如:14&15 (14 二进制 1110
15 二进制 1111
&与的结果 1110 ----》结果14)
(14&15).toString(2); //"1110"
2.|(或)
有一个是1就是1
例如:14|15 (14 二进制 1110
15 二进制 1111
|与的结果 1111 ----》结果15)
(14|15).toString(2); //"1111"
3.^(异或)
不同就是1
例如:14^15 (14 二进制 1110
15 二进制 1111
^与的结果 0001 ----》结果1)
(14^15).toString(2); //"1"
4.~(非)
说到这里就要科普一下了,JavaScript仅支持32位整型数
0变1,1变0
例如:~14(14 二进制 0000 0000 0000 0000 0000 0000 0000 1110
~的结果 1111 1111 1111 1111 1111 1111 1111 0001
最高位符号位为1,说明是个负数,大计基还记得嘛~~负数怎么来的
(正数二进制,取反,+1(为什么这样呢?因为计算机不擅长减法,所以把负数处理成补数,使得相减就等于他们的补数相加;而一个数的正负数取反相加是11111111...再+1才等于0,所以要+1))
逆过程,-1,取反
1111 1111 1111 1111 1111 1111 1111 0001 --> 0000 0000 0000 0000 0000 0000 0000 1111
----》15 ----》当然因为是个负数,最终结果是-15)
~14; //-15
5.<<(有符号左移)
有符号左移会将32位二进制数的所有位向左移动指定位数
num<<n相当于num乘以2的次方
var num = 5; // 二进制111 num << 3; // 二进制111000,十进制40
6.>>(有符号右移)
num>>n相当于num除以2的次方
(64).toString(2) //"1000000" (64>>3).toString(2) //"1000",十进制8
有符号左移与右移不会影响符号位。
7.>>>(无符号右移)
var num = -64; //11111111111111111111111111000000 (num >>> 5).toString(2); //"111111111111111111111111110",十进制134217726
ps:>> << ~有时候会用来取整
一般我们取整会用以下这些方式其中一种:
parseInt(1.5) //1 Math.round(1.5) //2 Math.floor(1.5) //1 Math.ceil(1.5) //2
但是有时候我们想追求更高的性能,我们会考虑用位运算来取整:
1.5>>0 //1 1.5<<0 //1 ~~1.5 //1
参与 位运算 的操作数都会先对其进行抽象的 ToInt32 操作,上面3种操作都没有实质对数字进行什么位运算,只是利用了它先对数字进行ToInt32操作的特性(因为ToInt32操作js没有提供方法接口)