题目:不使用临时变量实现两个整数的交换
代码
#include <stdio.h>
int main() {
int a = 10;
int b = 20;
// 第一步:a = a ^ b;
a = a ^ b;
// 第二步:b = a ^ b;
b = a ^ b;
// 第三步:a = a ^ b;
a = a ^ b;
// 输出交换后的结果
printf("a = %d b = %d\n", a, b);
return 0;
}
代码解释
这段代码通过三次位异或运算实现了两个整数的交换,而没有使用任何临时变量。让我们逐步分析这个过程:
第一步:a = a ^ b;
这一步将 a 和 b 进行异或运算,结果存储在 a 中。此时,a 包含了 a 和 b 的异或结果。
第二步:b = a ^ b;
这一步将新的 a(即 a^b)和原来的 b 进行异或运算,结果存储在 b 中。由于 abb 等于 a,所以 b 现在等于原来的 a。
第三步:a = a ^ b;
这一步将新的 a(即 a^b)和新的 b(即原来的 a)进行异或运算,结果存储在 a 中。由于 (ab)a 等于 b,所以 a 现在等于原来的 b。
异或运算的性质
异或运算符(^)具有以下性质,这些性质使得它非常适合用于交换变量:
交换律:a ^ b ^ b = a
结合律:(a ^ b) ^ b = a
自反性:a ^ a = 0
零元性:a ^ 0 = a
这些性质确保了通过三次异或运算,我们可以在不使用临时变量的情况下交换两个变量的值。