异或使用场景
在冒泡排序中,会使用到一个swap方法,用作交换两个值,有时会为了节省一个变量,直接使用下面的代码操作两个值的交换:
const arr = [1, 8, 6, 5, 7, 1];
function bubbleSort() {
for (let e = arr.length - 1; e > 0; e--) {
for (let i = 0; i < e; i++) {
if (arr[i] > arr[i + 1]) {
swap(arr, i, i + 1)
}
}
}
}
// 交换2个值
function swap(arr, i, j) {
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
bubbleSort()
console.log(arr);
那么swap方法到底是如何交换值的呢?容我们慢慢揭开她的面纱
运算规则
首先我们要了解异或运算: ^
异或运算的规则是:相同为0,不同为1
// a ^ b =
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0
两个数异或运算,规则一样:
1001
^ 1000
= 0001
因此,异或运算,我们可以理解为无进位相加。正常情况1+1要向前进一位,异或运算就是无进位的加法运算。
异或运算的特点
- 0 ^ N = N
- N ^ N = 0
- 交换性: a^b = b ^a
- 结核性: a^b^c=a^(b^c)
解析
通过上面介绍异或运算的特点,我们假设:
a = 甲
b = 乙
a = a ^ b; 翻译为:a = 甲 ^ 乙
b = a ^ b; 翻译为:b = 甲 ^ 乙 ^ 乙;翻译为:甲 ^ (乙 ^ 乙);根据上述的特点2,可以得出乙 ^ 乙为0;
即:甲 ^ 0;根据特点1,得出:b = 甲;
a = a ^ b;翻译为:a = 甲 ^ 乙 ^ 甲;翻译为: (甲 ^ 甲) ^ 乙;根据特点1、2,得出a = 乙
TypeScript复制代码
//Q 1、3、77 出现了2次(偶数次);3出现了1次,奇数次;求这个3
const arr = [1,1,2,3,3,77,77]
// A:
const arr = [1,1,2,2,3,3,4,5,5]
let result = 0;
for (let i in arr) {
result ^= arr[i]
}
console.log('result',result) // 4