JS中的按位操作

62 views次阅读
没有评论

按位操作

进行按位操作时,会先将十进制数转为二进制数。

& (按位与)

当每位都为1,结果才是1.

  8 & 7 // 0
  // 1000 & 0111 -> 0000 -> 0

| (按位或)

只要有一位是1,结果就是1.

  8 | 7 // 15
  // 1000 | 0111 -> 1111 -> 15

^ (按位异或)

每一位都不同,结果才是1.

  8 ^ 7 // -> 15
  8 ^ 8 // -> 0
  // 1000 ^ 0111 -> 1111 -> 15
  // 1000 ^ 1000 -> 0000 -> 0

这里可以发现 按位异或, 就是”不进位加法”

位运算

  1. 十进制33可以看成是 32 + 1,并且33应该是六位二进制的(因为33近似32,而32是2的 五次方,所以是六位),那么十进制33就是 100001,只要是2的次方那么都是1,否则都 是0
  2. 反过来对于二进制 100001,首位2^5为32,末位是2^0为1,相加为33

算术左移

左移就是将二进制全部往左移动,10在二进制中表示 1010,左移一位后变为10100,转换为 十进制就是20,所以基本可以把左移看成以下公式 a * (2^b)。

  10 << 1 // 20

算术右移

   10 >> 1 // 5

算术右移就是将二进制全部往右移动并去除多余的右边,10 在 二进制中表示1010,右移一 位后变为101,转换为10进制也就是5,所以基本把右移看出以下公式 int v = a / (2 ^ b) 右移很好用,比如可以在二分算法中取中间值。

  13 >> 1 // 6

活学活用

不使用四则运算得出两个数的和:

  /*
    可以使用按位异或,因为按位异或就是不进位加法,8 ^ 8 = 0.
    如果进位了,就是 16 了,所以我们只需要将两个数进行异或操作,然后进位。
    那么也就是说两个二进制都是 1 的 位置,左边应该有一个进位 1,
    所以可以得出以下公式 a + b = (a ^ b) + ((a & b) << 1) ,
    然后通过迭代的方式模拟加法
  */
  const sum = (a, b) => {
    if (a == 0) return b;
    if (b == 0) return a;
    let newA = a ^ b;
    let newB = (a & b) << 1;
    return sum(newA, newB);
  }

  const a = 10, b = 15;
  console.log(sum(a, b)); // 25

判断2的整数倍

给定一个整数,编写一个函数来判断它是否是 2 的幂次方。 因为2的幂次方转换成二进制总是1开头的,类似1000… ,而比它小1的数转换成二进制后总是所有位数都为1,这时两数相与的结果就是0。

  const isPowerOfTwo = (n) => {
    if(n <= 0) return false;
    return (n & (n - 1)) === 0;
  };
  const num = 16;
  console.log(isPowerOfTwo(num)); // true

1
guxuerui
版权声明:本站原创文章,由guxuerui于2020年07月28日发表,共计2125字。
转载提示:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
Loading...