参考资料是阮一峰的JavaScript标准参考教程(alpha)请狠狠点击这里
1、位运算直接对二进制位进行计算,位运算直接处理每一个比特位,是非常底层的运算,好处是速度极快,缺点是很不直观,许多场合不能够使用。
2、位运算只对整数起作用,如果一个运算子不是整数,会自动转为整数后再运行。
3、在JavaScript内部做运算时,是以32位带符号的整数进行运算的,并且返回值也是一个32位带符号的整数。
7种位运算
或运算、与运算
0|3 //3
1|2 //3
0&3 //0
1&2 //0
否运算
~3 //-4
显然3进行否运算之后是一个负数,负数在内存中采用补码的形式存在,此时求源码就是再次取补码并添上符号,也就是-4;简单记忆时可以进行否运算时,运算结果与运算子相加为-1;两次进行否运算得到数值本身,并且利用位运算对小数运算时,会自动转换为整数,两次取反即可得到整数,这是所有取整方法最快的一种。
~~4.222222 //4
因为否运算对于其它类型的参数也是想用Number方法转换为数字,在进行运算,所以:
~undefined //-1
~null //-1
~[] //-1
~NaN //-1
异或运算
异或运算在两个二进制位不同时返回1,相同时返回0。
7^12 //11
异或运算的特殊运用就是对两个数进行三次异或运算,可以互换他们的值,这也就意味着不需要引入临时变量:
var a=12;
var b=23;
a^=b,b^=a,a^=b;//a=23,b=12
//互换值的一般采用引入临时变量
var a=12;
var b=23;
var c;
c=a,a=b,b=c;
同样,异或运算也可以用来取整
1.23^0 //1
左移运算符
将一个数的二进制形式向前移动,尾部补0
4<<1 //8
-4<<1 //-8
同样,也可以用来取整:
12.44<<0 //12
-12.44<<0 //-12
右移运算符
将一个值的二进制形式向右移动,正数头部补上0,负数头部补上1
4>>1 //2
同样右移运算符也可以用来取整:
3.3>>0 //3
-2.3>>0 //-2
另外右移运算符可以模拟2的整除运算
5>>1 //等于5/2=2
5>>2 //等于5/4=1
23>>3 //等于23/8=2
带符号的右移运算符
将一个数的二进制形式向右移动,不管正数还是负数,头部均添上0,也就是说该运算符总是得到正数,即使是一个负数移动0位,JavaScript内部也会将其头部改为0,此时原来负数的补码,变为了正数的源码。
3>>>0 //3
-3>>>0 //4294967293
正是因为这个原因,此运算符只能对正数取整。
取整方法总结:
~~两次否运算,舍弃小数部分
1.23^0 异或运算符,舍弃小数部分
1.23<<0 左移运算符 ,舍弃小数部分
1.23>>0 右移运算符,舍弃小数部分
1.23>>>0带符号的右移运算符,只对正数有用
parseInt()舍弃小数部分
Math.round()四舍五入取整
Math.floor()向下取整
Math.ceil()向上取整
最后是一个广告贴,最近新开了一个分享技术的公众号,欢迎大家关注👇