位运算
什么是位运算?
我们都知道计算机使用的是二进制。位运算,说白了就是直接操作计算机中的二进制。性能极佳,而且有很多方便的地方。
常见的运算符有与&、或|、异或^、取反~、左移<<、右移>>是带符号右移 >>>无符号右移动。
接下来我们根据这些符号的规律,解决我们常见的一些问题。
位运算 与 &
我们都知道 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).