目录
一、题目介绍
现在想要交换两数的值,但是不能通过建立临时变量来交换。
二、传统解决方法
建立一个临时变量temp,来借助temp进行交换,将A的值暂存在temp中,将B的值赋值给A,最后将temp的值赋给B。
代码展示:
int main()
{
int a=3, b=5;
int temp;
printf("交换前:a=%d,b=%d\n",a,b);
temp = a;
a = b;
b = temp;
printf("交换后:a=%d,b=%d\n",a,b);
}
运行结果展示:
三、不建立临时变量进行交换的方法
运用算术运算符进行交换。
代码如下:
int main()
{
int a=3, b=5;
printf("交换前:a=%d,b=%d\n",a,b);
a = a + b;
b = a - b;
a = a - b;
printf("交换后:a=%d,b=%d\n",a,b);
}
运行结果:
此代码有一定的局限性,可以看出来我们的变量a,b是整型变量int的取值范围在32/64位系统中都是32位(4字节),范围为-2147483648~+2147483647,无符号情况下表示为0~4294967295。当遇到下面情况,就会出现交换出错的情况。
int main()
{
int a= 4294967295, b=5;
printf("交换前:a=%d,b=%d\n",a,b);
a = a + b;
b = a - b;
a = a - b;
printf("交换后:a=%d,b=%d\n",a,b);
}
运行结果就是下面的情况:
四、改进方法(不建立临时变量,交换两个变量的值)
1、方法介绍
在使用这个方法前先介绍一个操作符,异或操作符(^),他操作的是变量的二进制位,是一个双目操作符,当两个变量的对应二进制位相同则为0,不同则为1。
所以
a^a=0
0^a=a
进而可以得到
3^3^5=0^5=5
那么3^5^3=?
其实异或操作符是支持交换律的,不妨我们举例写一下:
3:011
5:101
3^5:110
3^5^3:101
即3^5^3=3^3^5=0^5=5
根据上面的介绍,可以写出如下的代码:
int main()
{
int a= 3, b=5;
printf("交换前:a=%d,b=%d\n",a,b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("交换后:a=%d,b=%d\n",a,b);
}
运行结果:
解释一下:
5,6行是“b=a”,6行的b=a^b就是b=a^b^b=a^0=a;7行的a=a^b就是a=a^b^a=b^0=b。
这样就将a和b的值进行了交换。