利用数值在计算机里都是用二进制存储的,我们可以把一个数当作是一个向量。比如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
