• javaScript:位运算


    位运算符:

    ~(NOT)
    把运算数转换为32位数字–>转换为反码–>转换为浮点数
    实质上是对数字求负,然后减1: ~25=-26,~-10=9

    &(AND)是对每个数字中的数位对齐,同一位置的两个数位进行”与”运算
    25=0000 0000 0000 0000 0000 0000 0001 1001
    3=0000 0000 0000 0000 0000 0000 0000 0011
    ————————————————————————————————————————————
    &=0000 0000 0000 0000 0000 0000 0000 0001 = 1

    |(OR)
    是对每个数字中的数位对齐,同一位置的两个数位进行”或”运算
    25=0000 0000 0000 0000 0000 0000 0001 1001
    3=0000 0000 0000 0000 0000 0000 0000 0011
    ————————————————————————————————————————————
    |=0000 0000 0000 0000 0000 0000 0001 1011 = 27

    ^(XOR)
    是对每个数字中的数位对齐,同一位置的两个数位进行”异或”运算
    25=0000 0000 0000 0000 0000 0000 0001 1001
    3=0000 0000 0000 0000 0000 0000 0000 0011
    ————————————————————————————————————————————
    ^=0000 0000 0000 0000 0000 0000 0001 1010 = 26

    <<(左移)
    是把所有位数(除了符号位)向左移制定数量,空位用0填充;
    2=0000 0000 0000 0000 0000 0000 0000 0010
    ————————————————————————————————————————————
    <<5=0000 0000 0000 0000 0000 0000 0100 0000=64

    >>(有符号位右移)
    是把所有位数(除了符号位)向右移制定数量,空位用0填充;
    64=0000 0000 0000 0000 0000 0000 0100 0000
    ————————————————————————————————————————————
    >>5=0000 0000 0000 0000 0000 0000 0000 0010=2

    类似的运算符 &&,||,!他们只运用在boolean运算中,而不是位运算。

    位运算基于数值数据也就是我们刚才提到的"integer"(被从64-bits floating point 经过 Toint32方法转化而来的32-bits integer),位运算结束后再被转化成双精度浮点型。

     Toint32我们不能调用,也不好猜测内部的实现逻辑,我们将它的规律总结如下:

      1、忽略所有的小数部分

      2、如果超出了32位整型能存储的范围,结果是1的二进制补码(即-1)

      3、如果是一个小于1的小数,结果是0

      4、如果是Infinity(无论正无穷还是负无穷)或者NAN,结果是0

      5、如果是true返回1、false返回0

      实际上javascript的位运算符并不是最快的,因为他们被限制为32位,而且需要从双精度浮点型转换而来并且再转化回去,尽管如此他们比传统的操作符要快,因为他们更接近于底层。

       下面是和0进行 Or操作的结果,这充分验证了Toint32函数和位运算的内部原理。 

    ToInt32 (col|0) : Numeric Values.
     -1.6-0+011.681616.8123e-2-Infinity+InfinityNaN
    col|0 -1 0 0 1 1 8 16 16 1 0 0 0
    ToInt32 (col|0) : String Values.
     """-1.6""0""1""1.6""8""16.8"

    "123

    e-2"

    "010"
    (Octal)
    "0x10"
    (Hex)
    "0xFF"
    (Hex)
    "-010""-0x10""xx"
    col|0 0 -1 0 1 1 8 16 1 10 16 255 -10 0 0
    ToInt32 (col|0) : Other Values.
     undefinednulltruefalsenew Object()function(){
    return;
    }
    col|0 0 0 1 0 0 0

    代码:

    var a = "10"| 0 ;
    console.log("Bitwise Or a is : " +a);
    var b = "s1132"|0;
    console.log("Bitwise Or b is : " +b);
    var c = [1,3,2]&1 ;
    console.log("Bitwise And c is : " +c);
    var d = [1]|0;
    console.log("Bitwise Or d is : " +d);
    var e = ~function(){}();
    console.log("Bitwise Not e is : " +e);
    var f = ({})|0;
    console.log("Bitwise Or f is : " +f);
    var g = ([1])|0;
    console.log("Bitwise Or g is : " +g);
    var h = "1ss"^0;
    console.log("Bitwise Exclusive Or h is : " +h);

    var arr=[1,2,3,4,5];
    console.log(arr|0);  //0
    var arr=[6];
    console.log(arr|0);  //6

    http://www.cnblogs.com/wisdomoon/p/3338327.html

    http://www.hehe0.com/javascript-wei-yun-suan-xiao-ji/

  • 相关阅读:
    【codecombat】 试玩全攻略 第二章 边远地区的森林 一步错
    【codecombat】 试玩全攻略 第十八关 最后的kithman族
    【codecombat】 试玩全攻略 第二章 边远地区的森林 woodlang cubbies
    【codecombat】 试玩全攻略 第二章 边远地区的森林 羊肠小道
    【codecombat】 试玩全攻略 第十七关 混乱的梦境
    【codecombat】 试玩全攻略 第二章 边远地区的森林 林中的死亡回避
    【codecombat】 试玩全攻略 特别关:kithguard斗殴
    【codecombat】 试玩全攻略 第二章 边远地区的森林 森林保卫战
    【codecombat】 试玩全攻略 第二章 边远地区的森林
    实验3 类和对象||
  • 原文地址:https://www.cnblogs.com/hongdada/p/3385480.html
Copyright © 2020-2023  润新知