0
点赞
收藏
分享

微信扫一扫

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


文章目录

  • ​​1、传统方式​​
  • ​​2、使用异或运算​​

题目:交换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^b

a = a^b

b = b

第二轮:b=a^b

a = a^b

b = a ^ b ^ b = a ^ (b ^ b) = a ^ 0 = a

第三轮:a=a^b

a = a ^ a ^ b = (a ^ a)^ b = 0 ^ b = b

b = a


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


举报

相关推荐

0 条评论