//不使用中间变量如何将a,b值交换
#include <stdio.h>
void swap1(int &a,int &b)
{
a=a+b;//使用加减运算符交换 带来的缺点是int类型的范围限制这种交换 一旦值大于2^32值会溢出
b=a-b;
a=a-b;
}
void swap2(int &a,int &b)
{
a^=b;
b^=a;
a^=b;
}
int main()
{
int a1 = 1, b1 = 2;
int a2 = 3, b2 = 4;
swap1 (a1,b1);
swap2 (a2,b2);
printf("a1= %d, b1 = %d\n",a1,b1);
printf("a2= %d, b2 = %d\n",a2,b2);
return 0;
}
大家都知道,假如有a,b两个整型数,我们可以用
a^=b;
b^=a;
a^=b;
来交换a,b的值,总结一下我个人的理解:
^ 在 C 里面是按位异或操作符,相同的话异或的结果就是 0,不同的话就是 1。。
牢记以下两条原则:
任何一位二进制数同 1 异或都会变成另外一个(0 同 1 异或的结果是 1,1 同 1 异或的结果是 0)
任何一位二进制数同 0 异或都保持不变(0 同 0 异或的结果是 0,1 同 0 异或的结果是 1)
因为 c 中是 1 的部分表示 a 和 b 中按位不同的位,0 表示 a 和 b 中按位相同的位,那么 a 同 c 异或的结果就是 a 中与 b 不同的位发生变化,二进制数每位只有两种状态,所以 a 变成了 b:
a = 0101
c = 1001
----
b = 1100
同样, b 与 c 异或结果就变成了 a:
b = 1100
c = 1001
----
a = 0101