文章里的代码均再vs2022中执行
在此之前应先了解源码、反码、补码和按位异或的操作规则。
代码:
#include <stdio.h>
int main()
{
int num1 = 1;
int num2 = 2;
num1 = num1 ^ num2;
num2 = num1 ^ num2;
num1 = num1 ^ num2;
printf("num1 = %d\n", num1);
printf("num2 = %d\n", num2);
return 0;
}
运行结果:
num1 = 2
num2 = 1
在解释之前先看一个结论:
按位异或对于任意的整数a,如果a^a则结果为0;如果a^0则结果为a
举例:
#include <stdio.h> int main() { int a = 1; //a的补码 00000000000000000000000000000001 //a的补码 00000000000000000000000000000001 int b = a ^ a; //进行按位异或的操作后b的值为 00000000000000000000000000000000 (值为0) //a的补码 00000000000000000000000000000001 //0的补码 00000000000000000000000000000000 //进行按位异或的操作后c的值为 00000000000000000000000000000001 (值为1) int c = a ^ 0; printf("b = %d\n", b); printf("c = %d\n", c); return 0; }
解释:
num1 = num1 ^ num2; num2 = num1 ^ num2; //此处可以看作为 num1 ^ num2 ^ num2,其结果为num1 //故执行上述代码后,把num1的值赋值给了num2 num1 = num1 ^ num2; //此处可以看作为 num1 ^ num2(此处的num2为num2的原数值) ^ num2(此处的 //num2是num1的数值)故可等价看作为: num1 ^ num2 ^ num1 ,其结果为num2 //执行之后,就把num2的值赋值给了num1