天天看点

位移运算符

位移运算符

位移运算符  直接操作二进制数,运算速率更快。
           
  1. 按位非(not) 把1变成0,把0变成1 超出运算范围,变成负数

    var a=25; var b=~a; b=?

    25的 二进制数:00000000000011001

    转化后: 11111111111100010

    结果为:-26

    总结非运算:一个数与自身的取反值相加等于-1。 此例中 25 与它的取反值-26 相加得1.

    2)按位与&(and) 都为1得1,都为0得0,不同得0

    var a=25 ; var b=a&3 b=??

    25的 二进制数:00000000000011001

    3的二进制数 :00000000000000011

    结果:00001 结果为:1

    与运算(&):两个二进制位中都为1,才返回1,否则返回0

    3)按位或 | (or) 都为1得1,都为0得0,不同得1

    var a=25 ; var b=a|3 b=??

    25的 二进制数:00000000000011001

    3的二进制数 :00000000000000011

    结果:11011 结果为: 27

    或运算(|):两个二进制位中只要有一个为1,就返回1,否则返回0

    4)按位异或(xor) 都为1得0,都为0得0,不同得1

    var a=25 ; var b=a|3 b=??

    25的 二进制数:00000000000011001

    3的二进制数 :00000000000000011

    结果:11010 结果为:26

    5)左移 << 负数运算操作补码 符号位不移动

    左移:将一个数的二进制值向左移动指定的位数,尾数补0,即乘以2的指定次方(符号位不参与移动)。

    例如1:

    var a=2 ; var b=a<<5 b=??

    2的进制数:00000000000000000000010

    移走5位 : 000000000000000010{00000}

    结果:64

    例如2:

    console.log(4 << 1); //8

    //4的二进制形式为100,左移一位相当于1000,即十进制的8,相当于乘以2的1次方

    console.log(-4 << 1); //-8 此例操作的负数的补码。用原码更简单

    //-4的二进制形式是11111111111111111111111111111100(4的二进制形式减1再取反)

    ,左移一位得到11111111111111111111111111111000,

    转换为十进制得到-8(减1后再取反)

    6)右移 >> 负数运算操作 符号位不移动

    右移:将一个数的二进制值向右移动指定位数,头部补0,即除以2的指定次方(符号位不参与移动)。

    例如:

    var a=64 ; var b=a>>5 b=??

    64的进制数:000000000000000010{00000}

    移走5位 : 00000000000000000000010

    结果:2

    右移就是:尾部删掉,符号为不变,前面0补齐。

    console.log(4 >> 1); //2

    console.log(-4 >> 1); //-2

    7)无符号右移 >>> 尾数删掉0,前面补齐0 符号位也移动 所以总得到正值

    无符号右移:该运算符表示将一个数的二进制形式向右移动,包括符号位也参与移动,头部补0,所以该运算总是得到正值。对于正数,该运算的结果与右移运算符(>>)完全一致,区别主要在于负数。

    例子1:

    var a=-64 ; var b=a>>>5 b=??

    -64的进制数:11111111111111111111110{00000}

    移走5位 : 00000011111111111111111111110

    结果:134217726

    整体右移,多余舍掉(符号位的1也舍掉)。前面用0补齐。

    例子2:

    console.log(-4 >>> 1); //2147483646

    因为-4的二进制形式为11111111111111111111111111111100 整体右移一位,得到

    01111111111111111111111111111110 ,转换为十进制得到2147483646。

    查看一个负整数在计算机内部的储存形式,最快的方法就是使用这个运算符。

    console.log(-1 >>> 0); //4294967295

    上面代码表示,-1作为32位整数时,内部的存储形式使用无符号整数格式解读,值为4294967295(换为二进制为11111111111111111111111111111111)

共同学习,如果有问题,希望大家多多指正。