异或运算交换两个数的原理和遇到的问题
异或运算交换两个数的原理:
代码:
let a = 10;
let b = 20;
a = a ^ b;
b = a ^ b;
a = a ^b;
console.log(a);
console.log(b);
分析:
首先我们通过数字逻辑的学习中知道异或运算:
它是位运算的一种,就是两个数的二进制的所有位来进行异或,相同为false, 相异为true.那么我们可以得出一个结论: a ^ a = 0 和 a ^ 0 = a.
那么, 上面代码块中的 b = a ^ b = a ^ b ^ b = a —> a = a ^ b,
b = a; a = a ^ b = a ^ b ^a = 0 ^ b = b ----> a = b, b = a;
a 和b 实现交换
异或运算的应用
代码:
function swap(number1, number2){
if(number1 < number2){
number1 = number1 ^ number2;
number2 = number1 ^ number2;
number1 = number1 ^ number2;
}
}
描述:
比较两个数的大小, 把大的给后面一个, 小的给前面一个.
异或运算会遇到的问题
案例:
function quickSort(array, start, end){
if(start >= end)
return;
let temp = array[start];
let left = start;
let right = end;
while(left < right){
while(array[right] > temp && right > left)
right--;
while(array[left] <= temp && left < right)
left++;
swap(array, left, right);
}
swap(array, left, start);
quickSort(array, start, left - 1);
quickSort(array, left + 1, end);
}
function swap(array, left, right){
if(left != right) {
array[left] = array[left] ^ array[right];
array[right] = array[left] ^ array[right];
array[left] = array[left] ^ array[right];
}
}
let array = [1, 2, 4, 5, 3, 8, 7 , 9, 0];
quickSort(array, 0, array.length - 1);
console.log(array.toLocaleString());
描述:
上面代码用js实现的快速排序,在代码的实现过程中, 博主遇到了一个和奇怪的问题, 就是执行下面的代码:
在运行过程中, left 和right 最后会相等, 但是博主为了减少代码量, 直接没有进行判断就让它们去swap. 最后发现, 排序后的数组出现了很多0;
分析:
在进行数组的交换时, 如果left = right, 在执行第一行代码:
array[left] = array[left] ^ array[right];
数组的值已经变成了0;
之后不管你怎么换 它的值都不会变了;因为数组是引用类型, 在对相对下标进行操作时, 会改变后面的数对它的引用;
解决:
在进行交换之前先判断, 如果是下标相同就不交换.
总结
异或运算在进行基本类型的交换时不需要判断, 如果是在进行引用类型数据交换时, 要判断该引用是否指向同一个实例, 如果是的, 交换会造成数据的破坏.(以上是博主的码码过程问题记录, 勿喷!!!)