位运算

189 阅读2分钟

位运算

什么是位运算?

我们都知道计算机使用的是二进制。位运算,说白了就是直接操作计算机中的二进制。性能极佳,而且有很多方便的地方。

常见的运算符有与&、或|、异或^、取反~、左移<<、右移>>是带符号右移 >>>无符号右移动。

接下来我们根据这些符号的规律,解决我们常见的一些问题。

位运算 与 &

我们都知道 1&1 = 1,0 & 1=0,0&0=0,1&0=0。

位运算 或 |

计算规则 1 | 0 = 1,0 | 0 = 0, 1 | 1 = 1, 0 | 1 = 1。

位运算 异或 ^

计算规则 0 ^ 0 = 0. 0 ^ 1 = 1, 1 ^ 1 = 0;

我们日常中交换两个数
function swap(a, b) {
    a = a ^ b;
    b = b ^ a;
    a = a ^ b;
}
判断奇偶

我们一般怎么判断奇偶,就是除2,如果是2进制我们怎么判断奇偶。很简单,我们只要判断最后一位,如果是1就是奇数,如果是0就是偶数。

function isOdd(num) {
  if (num & 1) {
    console.log("是奇数");
  }
}

正负变化

我们都知道正数取反加一就是负数。所以我们正负数转化的规则就是取反加一。

function signReverse(a) {
  return ~ a + 1;
}

求绝对值

我们知道正数的绝对值是本身,负数的绝对值是正书。

我们先取得符号位。

function my_abs(a) {
    var i = a >>> 31; // 获取符号位
    return i === 0 ? a : ~a + 1;
}

找出没有重复的数

给你一组整型数据,这些数据中,其中有一个数只出现了一次,其他的数都出现了两次,让你来找出一个数 。

function find(arr) {
  if(arr.length) {
    var temp = arr[0];
    for(i = 0; i < arr.length; i ++) {
      temp ^= arr[i];
    }
    return temp;
  }
};

原理很简单,我们知道一个数本身异或就是0。

3的n次方

我们使用位运算来实现3的n次方

function pow(n) {
  var sum = 1;
  var tmp = 3; // 底数 3
  if(n != 0) {
    if((n & 1) == 1) {
      sum *= tmp;
    }
    tmp *= tmp;
    n >> 1;
  }
  return sum;
}

寻找奇数出现次数

function findAddNum(arr) {
  for (let i = 0; i < arr.length; i++) {
    let tar = arr[i];
    e ^= tar;
  }
  return e;
}

寻找整数出现的次数

给定一个整型数组arr,其中有两个数出现了奇数次,其他的数都出现了偶数次,找到这两个数。要求时间复杂度为O(N),额外空间复杂度为O(1).