异或运算交换变量值
#include stdio.h #define swap(x, y) { \ //宏定义函数 x x ^ y; \ y x ^ y; \ x x ^ y; \ } int main() { int a 5, b 3; swap(a, b); printf(a%d, b%d, a, b); return 0; }异或运算的本质记录两个二进制数的相同位与不同位相同位标记为 0相异位标记为 1当 x 和 y 的位的差异被记录为 d 时已知 y 和 d一定能推出 x即根据异或运算的性质若已知两个数 x 与 y 的异或结果为 d即 x ^ y d那么用 d 再与 y 进行异或运算即可还原出 x即 d ^ y x。两个数交换的过程如下xy说明原始值01010011-x x ^ y01100011此时的x记录的是原始x和y的差异。即x变成了dy x ^ y01100101实质上就是原始y与d异或还原出了原始x记录于y。即y变成了xx x ^ y00110101实质上就是原始x与d异或还原出了原始y记录于x。即x变成了y我们可以总结出异或运算的几个重要性质1、交换律若 x ^ y d 则 y ^ x d2、逆运算若 x ^ y d 则 d ^ y x3、结合律(x ^ y) ^ z x ^ (y ^ z)4、恒等律x ^ 0 x5、归零律x ^ x 06、对合运算x ^ y ^ y x.说明1、由交换律(1)、恒等律(4)和逆运算(2)可以推出归零律(5)2、由结合律(3)和归零律(5)可以推出对合运算(6).由以上性质可得若 x ^ y d 则 x ^ d yy ^ d x. 可以用这条性质进行简单的数据交换另外计算机还常用寄存器的取反运算如1001 ^ 1111 0110在补码的运算中1、补码 原码的反码 12、原码 补码的反码 13、符号位与数值位一样参与运算没有特别的处理方式