^运算交换两个数的原理

本文探讨了使用异或运算交换两个数的原理,通过代码示例展示了如何通过异或实现无额外空间交换。同时,分析了在快速排序中,不正确使用异或交换导致数组元素变为0的问题,强调了在引用类型数据交换时需要避免相同引用的错误。最后,提供了修正后的代码并总结了异或运算在交换操作中应注意的事项。
摘要由CSDN通过智能技术生成

异或运算交换两个数的原理和遇到的问题

异或运算交换两个数的原理:

代码:

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;
之后不管你怎么换 它的值都不会变了;因为数组是引用类型, 在对相对下标进行操作时, 会改变后面的数对它的引用;

解决:
在进行交换之前先判断, 如果是下标相同就不交换.

总结

异或运算在进行基本类型的交换时不需要判断, 如果是在进行引用类型数据交换时, 要判断该引用是否指向同一个实例, 如果是的, 交换会造成数据的破坏.(以上是博主的码码过程问题记录, 勿喷!!!)

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值