1 异或定义
异或是一种位运行,数学符号记作 ⊕,在程序中记为 ^
,如 a⊕b 或 a^b
。
异或满足以下运行规则:
0⊕0=00⊕1=11⊕0=11⊕1=0
可以表示为下表,其中行和列分别为两数。
我们可以简单记忆为两数相同时返回0,不相同则返回1。
2 基本性质
设有两个 a 和 b 逻辑位,它们有以下性质:
- 交换律:a⊕b=b⊕a;
∵ 所有四种运算全部满足条件,∴ 结论成立。
- 结合律:(a⊕b)⊕c=a⊕(b⊕c);
a,b,c 共有 23=8 种取值情况,分别讨论发现所有情况都满足要求,因此结论成立。
- 不变性:a⊕0=a;
当 a=0 时,0⊕0=0
当 a=1 时,1⊕0=1
注意:a⊕1=1 不成立。
- 自毁性:a⊕a=0;
基本运算原则,相等为1。根据这个原则,结合保身性,我们很容易等到:x⊕x⊕x=x,这个结论非常重要,在密码学中的对称加密中经常用到。
- 可替性:若 a⊕b=c,则 a⊕c=b(或 b⊕c=a);
证明: ∵a⊕b=c,∴a⊕c=a⊕a⊕b=0⊕b=b,证毕(同理,可证b⊕c=a)。
3 其他性质研究
计算机系统是基于二进制的存储系统,最基本的单元是位(bit),每个位只表示0或1,但是由于存储的便利,使用的是每8位为一个单元的字节byte,所以在下面的讨论中,都是基于字节的。由于更多的字节都是只是对单字节的重复, 所以主要以研究单字节为主。
3.2 基本定义
定义:求1函数 o=One(b),其中 One 表示字节 b 中 1的个数,记为O(b)。定义 PO(b)=P(O(b)) 为 b 超奇偶性,即 b 中1的个数是奇数还是偶数。
几个函数的范围情况如下所示。
- O(b):返回一个字节中1的个数。
定义域:[0, 256)
值域:[0, 8]
- P(b):判断一个数的奇偶性
定义域:[0, 256)
值域:{ODD, EVEN} # 注:分别表示奇数和偶数。
- PO(b):判断一个字节的超奇偶性
定义域:[0, 256)
值域:{ODD, EVEN}
3.1 PO(b) 超奇偶性性质
定理1:设 a⊕b=c,则 PO(a)⊕PO(b)=PO(c)。
证明:先考虑 a 和 b 只有一位的情况。此时,只有四种基本情况,如第1部分表格所示,这四种情况都成立,所以等式成立。由于各位之间都是独立的,所以当 a 和 b 为多位时,等式也成立。
根据这个结论,我们可以知两个相同的字节的超奇偶性不同时,其异或结果的超奇偶性相同。但是如果两者超奇偶性相同,则结果的超奇偶性不确定。
举例来说,若 b1 和 b2 为两个相同长度的多位二进制数,两个数中1的总个数为 n,设 b1⊕b2=b3 且 b3 中的1的个数为 m 个,那么 n 与 m 的奇偶性是一样的。如 b1=01010101,b2=10101101,b3=11111000,此时 n=9,m=5 都是奇数。