异或运算交换变量值

异或运算交换变量值
#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)。

两个数交换的过程如下:

x

y

说明

原始值

0101

0011

-

x = x ^ y

0110

0011

此时的x记录的是原始x和y的差异。即x变成了d

y = x ^ y

0110

0101

实质上就是原始y与d异或,还原出了原始x,记录于y。即y变成了x

x = x ^ y

0011

0101

实质上就是原始x与d异或,还原出了原始y,记录于x。即x变成了y

我们可以总结出异或运算的几个重要性质:

1、交换律:若 x ^ y = d ,则 y ^ x = d;

2、逆运算:若 x ^ y = d ,则 d ^ y = x;

3、结合律:(x ^ y) ^ z = x ^ (y ^ z);

4、恒等律:x ^ 0 = x;

5、归零律:x ^ x = 0;

6、对合运算:x ^ y ^ y = x.

说明:

1、由交换律(1)、恒等律(4)和逆运算(2)可以推出归零律(5);

2、由结合律(3)和归零律(5)可以推出对合运算(6).

由以上性质可得:若 x ^ y = d ,则 x ^ d = y,y ^ d = x. 可以用这条性质进行简单的数据交换

另外,计算机还常用寄存器的取反运算,如:1001 ^ 1111 = 0110

在补码的运算中:

1、补码 = 原码的反码 + 1

2、原码 = 补码的反码 + 1

3、符号位与数值位一样参与运算,没有特别的处理方式