异或^运算——完成两数交换
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^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 |
即通过异或运算达到了两数交换的目的。如果两数的内存地址相同,则该方法不适用
以上是关于异或^运算——完成两数交换的主要内容,如果未能解决你的问题,请参考以下文章