对于数值的交换操作,通常会采用第三个变量作为中间变量过渡的交换方式。
temp=a;
a=b;
b=temp;
使用这种方法,可以保证交换的准确性,但是由于会使用第三个变量,占用了额外的内存空间。
那么有没有办法不借助第三个变量实现两个数值的交换呢?可以通过数值相加寄存和位运算两种方式。
1、相加寄存:
可以将sum=a+b的值暂时寄存到a变量上,由于a=sum-b,所以可以将a值放置到b上,又由于b=sum-a,可以将b值移动至a,实现a,b的交换。
a=a+b;
b=a-b;
a=a=b;
通过这种方式可以再不引入新的变量的情况下实现交换,但是当a+b>INT_MAX时,此时会产生正溢出,导致最终结果错误。
2、位运算:
对于任一位向量a,有a^a=0,a^0=a,为了实现交换,可以推导出a=a^a^b,b=b^b^a。
b=a^b;
a=a^b;
b=a^b;
列一个表格来简单看一下为什么位运算可以实现数值交换。
初始值 | a | b |
b=a^b | a | a^b |
a=a^b | a^a^b=b | a^b |
b=a^b | b | a^b^b=a |
利用异或的运算法则即可实现数值交换(此方法除了减少了中间变量的使用,对于性能提升并无卵用)。