异或^运算——完成两数交换

Posted 默辨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了异或^运算——完成两数交换相关的知识,希望对你有一定的参考价值。

文章目录

题目:交换arr[j]和arr[j+1]两个数

1、传统方式

定义一个tmp临时变量

tem = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = tem;

2、使用异或运算

arr[j] = arr[j] ^ arr[j + 1];
arr[j + 1] = arr[j] ^ arr[j + 1];
arr[j] = arr[j] ^ arr[j + 1];

知识前提:相同为0,不同为1。也可以理解为,与0异或就是其本身,与自己异或为0

0^0 = 0
1^0 = 1
0^1 = 1
1^1 = 0

并且满足以下特点:

交换律:a ^ b ^ c = a ^ c ^ b

结合律:a ^(b ^ c) =( a ^ c)^ b



回到这个例子

arr[j] = arr[j] ^ arr[j + 1];
arr[j + 1] = arr[j] ^ arr[j + 1];
arr[j] = arr[j] ^ arr[j + 1];

我们把arr[j]当作a, arr[j + 1]当作b,即简化为

牢记前文提到的,与0异或就是其本身,与自己异或为0

代码行数a的当前值b的当前值
第一轮:a=a^ba = a^bb = b
第二轮:b=a^ba = a^bb = a ^ b ^ b = a ^ (b ^ b) = a ^ 0 = a
第三轮:a=a^ba = a ^ a ^ b = (a ^ a)^ b = 0 ^ b = bb = a



即通过异或运算达到了两数交换的目的。如果两数的内存地址相同,则该方法不适用

以上是关于异或^运算——完成两数交换的主要内容,如果未能解决你的问题,请参考以下文章

异或交换两数

异或运算进行两数交换

异或运算实现两数交换

异或交换两个变量值

面试题 16.01. 交换数字-----位运算

异或运算