对于任一位向量a,有a^a =0。应用这一属性,考虑下面的程序:
void inplace_swap(int *x,int *y){ *y=*x^*y; /*Step1*/ *y=*x^*y; /*Step2*/ *y=*x^*y; /*Step3*/ }
正如程序名字所暗示的那样,我们认为这个过程的效果是交换指针变量x和y所指向储位置处值注意,与通常的交换两个数值的技术不一样,当移动一个值 时,我们不需要第三个位置来临时存储另一个值。这种交换方式并没有性能上的优 势,它仅仅是一个智力游戏。
以指针x和y指向的位置存储的值分别是a和b作为开始,填写下表,给出在程序的 每一步之后,存储在这两个位置中的值。利用^的属性证明达到了所希望的效果。回想一下,每个元素就是它自身的加法逆元(a^a=0)。
步骤 | *x | *y |
初始 | a | b |
第i步 |
|
|
第2步 |
|
|
第3步 |
|
|