js 中位运算的应用

按位运算符有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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容