JavaScript中的位运算

参考资料是阮一峰的JavaScript标准参考教程(alpha)请狠狠点击这里
1、位运算直接对二进制位进行计算,位运算直接处理每一个比特位,是非常底层的运算,好处是速度极快,缺点是很不直观,许多场合不能够使用。
2、位运算只对整数起作用,如果一个运算子不是整数,会自动转为整数后再运行。
3、在JavaScript内部做运算时,是以32位带符号的整数进行运算的,并且返回值也是一个32位带符号的整数。

《JavaScript中的位运算》 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()向上取整

最后是一个广告贴,最近新开了一个分享技术的公众号,欢迎大家关注👇

《JavaScript中的位运算》

    原文作者:忽如寄
    原文地址: https://www.jianshu.com/p/53ad79b0b6ee
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞