1. 异或方式交换
#include <stdio.h>
int main()
{
char a,b;
scanf("%c %c",&a,&b);
a ^= b ^= a ^= b; //核心
printf("a = %c b = %c",a,b);
return 0;
}
运算结果:
算式:
a ^= b 相当于 a = a ^ b
变量(a) = 存储的值的二进制 (a) ^ 存储的值的二进制(b)
规则(二进制运算):
0 ^ 0 = 0
1 ^ 1 = 0
0 ^ 1 = 1
1 ^ 0 = 1
类似于二进制加法运算,但不进位
假设:
a = f , b = g ,求 a ^ b
f,g的ascii码102,103
f 的二进制:0110 0110 ; g的二进制:0110 0111
两者的二进制相加,但不进位
0110 0110 0110 0111 —————————— 0000 0001 (a^b的二进制结果)
回归 a ^= b ^= a ^= b
^= 异或运算符 运算方向:自右至左 a = f = 102 = 0110 0110 b = g = 103 = 0110 0111 先算最右边的a ^= b,得到二进制结果a = 0000 0001 当前: a = 0000 0001 b = 0110 0111 接着算b ^= a,得到二进制结果b = 0110 0110 当前: a = 0000 0001 b = 0110 0110 最后算左边的a ^= b,得到二进制结果 a = 0110 0111 当前: a = 0110 0111 b = 0110 0110 a,b 值交换完成
实质是同一位的二进制0,1的相互交换
所以说,只要变量的值是能转成二进制,不管是什么类型的变量,那这两个变量的值都可以用异或方式交换(a ^= b ^= a ^= b)