一、异或(^)的定义
异或运算法则由下表所定义:
^ | 0 | 1 |
---|---|---|
0 | 0 | 1 |
1 | 1 | 0 |
可见,表是关于对称的,异或运算是满足交换律的。
二、异或的基本规律
对于一位二进制数,x(x = 0, 或x= 1)有以下规律(其中a,b,c都是一位二进制数):
a ^ a = 0
a ^ 0 = a
a ^ 1 = ~a
交换律:a ^ b = b ^ a (异或定义)
结合律:a ^ ( b ^ c) = (a ^ b) ^ c
证明:
a | b | c | (a ^ b) ^ c | a ^ (b ^ c) | |
---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 1 | 1 | 1 |
2 | 0 | 1 | 0 | 1 | 1 |
3 | 0 | 1 | 1 | 0 | 0 |
4 | 1 | 0 | 0 | 1 | 1 |
5 | 1 | 0 | 1 | 0 | 0 |
6 | 1 | 1 | 0 | 0 | 0 |
7 | 1 | 1 | 1 | 1 | 1 |
结合律和交换律还可以推广到n个二进制数做异或运算,就得出了一个结论:n个一位二进制数相异或,只要数这n个二进制数有多少个1,奇数个1的话,异或结果为1。偶数个1结果为0。
三、交换整数的值
a = a ^ b
b = a ^ b = (a ^ b) ^ b = a ^ (b ^ b) = a ^ 0 = a
a = a ^ b = a ^ b ^ a= a ^ a ^ b = 0 ^ b = b
解释:我们只证明了一位二进制数,对于32位整数如何成立呢?
因为32位的二进制数是由32个0或1组成的,按位异或计算是每个位算自己的,与其他的位是独立的,因此这个结论对多位二进制数也成立,包括负整数,对浮点数是不成立的,因为浮点的表示与整数表示的差别很大。