不需要第三变量,实时交换数据

深入理解计算机系统第二章P34页练习题

[cpp]  view plain copy
  1. void inplace_swap(int *x,int *y)  
  2. {  
  3.         *x = *x ^ *y;  
  4.         *y = *x ^ *y;  
  5.         *x = *x ^ *y;  
  6. }  

 

在深入理解计算机系统中有这样的一道习题,也是常见的面试题目,即不用第三个变量,实时交换二个数的值。上面代码是其实现其方法,但接下来提出了如下一个问题,如这个函数的基础上,实现将一个数组中元素头尾两端依次对调。这个函数实现起来比较简单,通过inplace_swap()这个函数把第1元素与最后一个元素对换,依此类推。书上给出如下的代码。

[cpp]  view plain copy
  1. void reverse_array(int a[], int cnt)  
  2. {  
  3.     int first,last;  
  4.     for (first = 0,last = cnt - 1;  
  5.          first <= last; first++,last-- )  
  6.     {  
  7.         inplace_swap(&a[first], &a[last]);  
  8.     }  

经过测试,如果数组元素为偶数个,其结果正确,如果数组个数为奇数个,则得到中间的元素为0。

看到这里,我想到for语句中的判断条件应该改为first < last;奇数个的话就没有必要交换了。但随后又想,就算是要判断,把二个数自己交换自己,应该得到的结果也是正确的啊??????

自己用手写了一下,觉得也应该是正确的,但我认为这书不会犯这样的低级错误,于是自己写了个简单程序测试了一下。

[c-sharp]  view plain copy
  1. include <stdio.h>  
  2. #include <stdlib.h>  
  3. void inplace_swap(int *x,int *y)  
  4. {  
  5.         *x = *x ^ *y;  
  6.         *y = *x ^ *y;  
  7.         *x = *x ^ *y;  
  8. }  
  9. int main(void)  
  10. {  
  11.         int a = 3;  
  12.         int b = 3;  
  13.         int c = 3;  
  14.         inplace_swap(&a,&b);  
  15.         printf("%d,%d/n",&a,&b);  
  16. //      inplace_swap(&c,&c);  
  17. //      printf("%d/n",c);  
  18.         return 0;  
  19. }  

得到的结果是:

3,3

0

验证了书上所说的是正确的,这时我自己想了想如果自己与自己交换,则每次都是从同一个地址中取值,如*x = *x ^ *y;x所指地址的值为0,即y所指的址址中的值也为0,所以接下来的运算肯定得到结果都为0;而如果是取二个值相同但是不同的变量来交换的话,还是满足条件的。

虽然只是一个小问题,但这个小问题反应出一个人的基本功。看样子,我的内功急需加强,每天前进一小步,几年后就是一大步,加油。

### 回答1: 使用两个变量交换值的方法有很多种,这里介绍两种方法: 1. 使用加法和减法: ``` a = a + b; b = a - b; a = a - b; ``` 2. 使用位运算: ``` a = a ^ b; b = a ^ b; a = a ^ b; ``` 请注意,如果你的变量是一个非整数,请使用第一种方法。 ### 回答2: 在不使用第三变量的情况下交换两个变量的值,可以通过数学运算和位运算来实现。 1. 使用数学运算:假设有两个变量a和b,初始值分别为a0和b0。交换它们的值的思路是将a的值赋给b,再将b的值赋给a。 a = a + b b = a - b a = a - b 通过数学运算,a和b的值被成功交换。 2. 使用位运算:假设有两个变量a和b,初始值分别为a0和b0。交换它们的值的思路是将a与b进行异或操作两次,即(a^b)^b,这样就可以得到a的值。然后再通过a与b进行异或操作,即(a^b)^a,得到b的值。 a = a ^ b b = (a ^ b) ^ b a = (a ^ b) ^ a 通过位运算,a和b的值成功地交换了。 这种交换值的方法不需要使用额外的存储空间,且适用于多种数据类型,但需要注意的是,在使用位运算时,需要确保a和b的类型是相同的。 ### 回答3: 在不使用第三变量的情况下,可以通过数学运算来交换两个变量的值。 假设有两个变量a和b,初始值分别为a0和b0。要交换这两个变量的值,可以按照以下步骤进行操作: 1. 将变量a的值与变量b相加并赋值给变量a:a = a + b 此时,变量a的值为a0 + b0。 2. 将原始变量a的值与变量b的初始值b0相减,并赋值给变量b:b = a - b0 此时,变量b的值为a0 + b0 - b0,即为原始变量a的值。 3. 将原始变量b的初始值b0赋值给变量a:a = b0 此时,变量a的值为原始变量b的值。 通过以上步骤,变量a和变量b的值已经交换完成。这是因为在计算过程中,变量a的值已经累加了变量b的值,所以在第三步将原始的变量b的初始值赋给变量a时,相当于将原始的变量b的值赋给了变量a,而变量b则获得了变量a的原始值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值