异或运算(^、xor)

在编程中,想要交换A、B两个值,一般的做法都是开辟一个额外空间来存放A的值,将B的值放到A中,再将存放在额外空间中的值放到B中,这样完成一次A和B的交换。
那么为啥不直接将A的值放到B中,再将B的值放到A中呢?因为这样在第一次A的值放到B中,B的值已经被覆盖,此时B的值也变成A所存放的值了,所以最后的结果就是A和B中都是存放的A的值,B原先的值丢失了。
那么有没有方法不开辟额外的内存空间来完成一次交换呢?答案是可以的,使用异或运算,即下面这样,三行代码就可以完成:

a = a ^ b
b = a ^ b
a = a ^ b

这三行代码发生了什么事,既然能在不开辟额外空间的条件下完成a和b的互换?在这之前,先要明白异或运算的定义和它的一些特性:

异或运算:异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1)
特性1:0和任何数做异或运算都等于这个数本身,即0^N=N。
特性2:异或运算满足乘法和加法中的交换律,即a^b^c和c^b^a的结果是一样的。
特性3:一个运算式子中,偶数个相同数异或结果为0,奇数个相同数异或结果是这个数本身,即a^a^a^a=0,a^a^a=a。

搞清楚了异或运算的概念和一些特性后,回过头来看上面三行代码发生的过程:
第一行:a做了赋值运算,发生了改变,此时a记为a^b,b的值不变还是b;
第二行:a在第一行之后变为a^b, b做了赋值运算,此时b的值为a^b ^b,结合上面特性,此时b最终的结果为a;
第三行:b在第二行之后变成了a,a做赋值运算,此时a的值为a^b ^a,结合上面特性,a最终的运算结果为b。
以上就是三行代码发生的全过程,使用异或运算在不开辟额外空间的情况下就能交换两个值。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 这里主要针对计算机编程中的异或运算进行解释。 我们先看一下一般的定义: 异或,英文为exclusive OR,或缩...
    塘浅阅读 7,974评论 1 4
  • 位运算,由于它直接操作在最底层速度快、内存消耗少、效率高,很多大厂的面试题也层出不穷,leetcode 上也有很多...
    湖底冰砚阅读 465评论 0 0
  • 本文作者是一位4年开发经验的iOS开发者,在经历了网易和腾讯面试之后总计出如下的面试经验! 作者:starrrin...
    lp_lp阅读 2,321评论 3 8
  • 堆和栈 堆Java的堆是一个运行时数据区,类的对象从堆中分配空间。这些对象通过new等指令建立,通过垃圾回收器来销...
    白茫茫的大地阅读 387评论 0 0
  • 认识异或运算 异或运算:相同为0,不同为1同或运算:相同为1,不同为0所以异或运算就可以记为无进位相加 异或运算的...
    鹰艺阅读 1,102评论 0 1

友情链接更多精彩内容