利用数值在计算机里都是用二进制存储的,我们可以把一个数当作是一个向量。比如int x = 9,那么它在计算机里就是[00001001000000000000000000000000](小端法)这个向量并且把它记为向量a
(意思是a=[00001001000000000000000000000000]);同理可以得出int y=10 为b=[00001010000000000000000000000000]。我们利用按位布尔运算的异或(^)--------任何数或者向量a对自己进行异或运算都为0(a^a=0),其实就不难想到a^a^b=b(因为0向量与任何向量b(由布尔代数组成的,意思是由二进制组成的)按位布尔运算结果都是向量b。
代码如下:
#include <iostream>
using namespace std;
typedef int ElemType;
// 交换两个数值
void inplace_swap(ElemType* x, ElemType* y) {
*y = *x ^ *y; /*--step1--*/
*x = *x ^ *y; /*--step2--*/
*y = *y ^ *x; /*--step3--*/
}
int main()
{
ElemType x = 15, y=20;
inplace_swap(&x,&y);
cout << x << endl << y << endl;
return 0;
}
/* 注意只要step1确定了,那么step2和step3就不能更改顺序
* 还可以这样写
* *x = *x ^ *y; //--step1--
* *y = *y ^ *x; //--step2--
* *x = *x ^ *y; //--step3--
*/
其实上面这种运算有一个缺陷那就是:当我们传递的地址为同一个地址时 得出的结果时0,这个就改变了我们最初想要的结果!
假如inplace_swap(&x,&y);改为inplace_swap(&x,&x);那么x的值将会为0