美文网首页
js 中位运算的应用

js 中位运算的应用

作者: 月下吴刚_c8c7 | 来源:发表于2019-02-22 17:02 被阅读0次

    按位运算符有6个:

    • 按位与 &
    • 按位或 |
    • 按位异或 ^
    • 取反 ~
    • 右移 >>
    • 左移 <<

    应用

    • 用一个数和1进行按位&操作来判断奇偶数,而且速度比判断余数更快

      奇数的二进制码的最后一位数肯定是1,而1只有最后一位为1,按位&操作之后,结果肯定只有最后一位数为1。而偶数的二进制表示的最后一位数是0,和1进行按位&操作,结果所有位数都为0。
      只要任何一位是0 &运算的结果就是 0,所以可以用&把某个变量不必要的位设为0, 比如某个变量的二进制表示为 0 1 0 0 1 0 0 1, 我想保留低4位,消除高4位, 用 & 0x0F就可以了(注:0x为16进制表示法,0x0F 对应的二进制为 0 0 0 0 1 1 1 1)

    function assert(n) {
       if (n & 1) {
          console.log("n是奇数");
      } else {
          console.log("n是偶数");
      }
    }
    assert(3); // "n是奇数"
    
    • 用位运算 | 来向下求整

    其实浮点数是不支持位运算的,所以会先把1.1转成整数1再进行位运算,就好像是对浮点数向下求整。所以1|0的结果就是1。

    var num = 1.1 | 0;    // 结果为1
    
    • 用异或运算 ^ 调换两个数字的值
    var num1 = 1, num2 = 2;
    num1 = [num2, num2 = num1][0];
    console.log(num1); // 2
    console.log(num2); // 1
    
    var num1 = 1, num2 = 2;
    num1 ^= num2; // num1 = num1 ^ num2 = 1 ^ 2 = 3
    num2 ^= num1; // num2 = num2 ^ (num1 ^ num2) = num1 = 1
    num1 ^= num2; // num1 = num1 ^ num2 ^ num1 = num2 = 2
    console.log(num1); // 2
    console.log(num2); // 1
    
    • 取反 ` 运算

    对一个整数num按位求反, 等于它的 相反数减1,即 ~num = -num-1;
    ~~num == -(num-1)-1 === num; 对一个数两次求反结果为这个数本身
    浮点数是不支持位运算的,所以会先直接去除小数部分,转成整数再进行位运算,就好像是对浮点数向下求整
    ~~可以进行类型转换,位运算会默认将非数字类型转换成数字类型再进行运算 (转换结果为整数 直接去除小数部分)

    ~~true == 1;
    ~~false == 0;
    ~~"" == 0;
    ~~"all" == 0;
    ~~"32all" == 0;
    ~~"all43" == 0;
    ~~[] == 0;
    ~~undefined ==0;
    ~~!undefined == 1;
    ~~null == 0;
    ~~!null == 1;
    ~~(5.9) == 5;
    ~~(5.2) == 5;
    ~~(-5.9) == -5;
    
    • 移位运算符 左移<< , 右移>>

    向左移 几位就等于乘 2 的几次方, 同理右移几位等于 除以 2 的几次方
    2向前移动1位变成4 利用这个特性可以做乘法运算
    同理 >> 则可以做除法运算
    任何小数 把它 >> 0可以取整
    如3.14159 >> 0 = 3;
    其默认将非数字类型的转换为数字类型再做运算的性质与 ~~ , | 0 一样

    2 << 1 = 4    // 2 向左移1位, 即为 2*2  得4
    3 << 1 = 6   // 3 向左移1位, 即为 3*2  得6
    8 >>1 = 4   // 8向右移1位, 即为 8/2  得4
    

    相关文章

      网友评论

          本文标题:js 中位运算的应用

          本文链接:https://www.haomeiwen.com/subject/vfweyqtx.html