异或为什么满足结合律,布尔代数与布尔环简介

  之前在学习C语言中的按位运算时,有做到一道leetcode题目:

Image


  这个题的核心思路就是利用异或的性质:

//异或的定义
对二进制位0 1来说,如果说0代表假1代表真,
那么对于两个二进制位a和b来说
a异或b的意思就是要么a为真b为假 要么a为假b为真
满足这两种情况时a异或b为真,否则a异或b为假
所以
1 ^ 1 = 0;
1 ^ 0 = 1;
0 ^ 1 = 1;
0 ^ 0 = 0;
对于两个相同长度的位序列x和y来说
x ^ y 的结果就是把x和y的每一个二进制位进行上面的运算
//异或的性质
a ^ a = 0;
a ^ b = b ^ a;
a ^ 0 = 0;
(a ^ b) ^ c = a ^ (b ^ c);

  于是把所有的数组中所有的元素都异或到一起得到一个数,这个数就是那个不相同的两个数(我们设为x和y)的异或的结果,然后根据这两个数x和y一定不相同,可以推出他们两个取异或的结果一定不是0,也就是说,一定有一位(我们设为第n位 1 <= n <= 32)为1。

  然后弄出一个第n位是1,其他位是0的数k,把k和数组中原本元素a[i]按位取与,如果结果非0,说明a[i]的第n位是1;如果结果是0,那么a[i]的第n位就是0,然后按这个结果把数组中的元素分成两个数组。

  这个方法的巧妙在于原本数组中除x和y外,其他数出现了两次,假设2 2在原数组中出现,那么2 2一定会被分到同一个数组中去,因为它们的二进制位完全相同。

  然后对分成的两个数组,把每个数组中的所有元素都异或起来,就可以得到x和y。

Image

  这个方法很好的利用了异或的性质。

Image

题解:

Image

  但是问题就出现了,aa=0,这个性质很好理解,a和a的二进制位完全相同,每一位异或出来的结果都是0,所以总结果是0;ab=ba也很好理解,因为从每一位的角度上讲,异或是可以交换的;但是(ab)c=a(b^c)这个性质并不好理解。

  在上网查了很多资料以后,我发现大部分资料要么太数学了(完全不结合实际),要么太计算机了(证明不严谨),所以本文的目的是给出一个相对容易理解并且保证严谨度的证明。

证明异或运算满足结合律

  我们首先的是介绍由0 1 & | ~ 组成的代数结构,这在数学上被称为布尔代数。

  设集合B中有至少有两个元素0和1,在有限集下B中的元素个数必须为偶数,并且在B上定义了以下三种运算,它们满足以下性质:

a ∧ b = b ∧ a , a ∨ b = b ∨ a a ∧ ( b ∨ c ) = ( a ∧ b ) ∨ ( a ∧ c ) a ∨ ( b ∧ c ) = ( a ∨ b ) ∧ ( a ∨ c ) a ∨ 0 = a , a ∧ 1 = a a ∨ ( ∼ a ) = 1 , a ∧ ( ∼ a ) = 0 a \wedge b = b \wedge a, a \vee b = b \vee a\\ a \wedge (b\vee c) = (a\wedge b)\vee (a\wedge c)\\ a\vee (b\wedge c) = (a\vee b) \wedge (a\vee c)\\ a\vee 0 = a, a\wedge 1 = a\\ a \vee (\sim a) = 1,a\wedge (\sim a) = 0 ab=ba,ab=baa(bc)=(ab)(ac)a(bc)=(ab)(ac)a0=a,a1=aa(a)=1,a(a)=0

  很明显,我们如果把所有二进制位都是0的元素定义成0,把所有二进制位都是1的元素定义成1,那么显然我们的所有整形的集合加上&、|、运算构成了一个布尔代数。&对应且,|对应或,对应取反。

  那布尔代数和我们要讨论的问题到底有什么关系呢?有了这些运算,我们可以定义异或运算如下:

a ⊕ b = ( a ∧ ∼ b ) ∨ ( ∼ a ∧ b ) a\oplus b = (a \wedge \sim b) \vee (\sim a \wedge b) ab=(ab)(ab)

  这个定义是自然的,a异或b从二进制位上来说讲,第i位的结果等于:如果a的第i为是1且b的第i位是0或a的第i位是0且b的第i位是1的情况下,结果为1;否则结果为0,这不就是对每一位来说a的第i位是1且非b的第i位是0或非a的第i位是1且b的第i位是0嘛,对每一位都是成立的,推广到整个位序列就可这样定义。

  有了这个定义,证明也就简单了。

( a ⊕ b ) ⊕ c = ( ( a ∧ ∼ b ) ∨ ( ∼ a ∧ b ) ) ⊕ c = ( ( ( a ∧ ∼ b ) ∨ ( ∼ a ∧ b ) ) ∧ ∼ c ) ∨ ( ( ∼ ( ( a ∧ ∼ b ) ∨ ( ∼ a ∧ b ) ) ) ∧ c ) = ( ( ( a ∧ ∼ b ) ∨ ( ∼ a ∧ b ) ) ∧ ∼ c ) ∨ ( ( ( ∼ a ∨ b ) ∧ ( a ∨ ∼ b ) ) ∧ c ) = ( a ∧ ∼ b ∧ ∼ c ) ∨ ( ∼ a ∧ b ∧ ∼ c ) ∨ ( ( ( ( ∼ a ∨ b ) ∧ a ) ∨ ( ( ∼ a ∨ b ) ∧ ∼ b ) ) ∧ c ) = ( a ∧ ∼ b ∧ ∼ c ) ∨ ( ∼ a ∧ b ∧ ∼ c ) ∨ ( a ∧ b ∧ c ) ∨ ( ∼ a ∧ ∼ b ∧ c ) (a\oplus b ) \oplus c = ((a \wedge \sim b) \vee (\sim a \wedge b))\oplus c\\ =(((a \wedge \sim b) \vee (\sim a \wedge b))\wedge \sim c) \vee \\ ((\sim ((a \wedge \sim b) \vee (\sim a \wedge b)))\wedge c)\\ =(((a \wedge \sim b) \vee (\sim a \wedge b))\wedge \sim c) \vee\\ (((\sim a \vee b)\wedge (a\vee \sim b))\wedge c)\\ =(a\wedge \sim b \wedge \sim c) \vee (\sim a \wedge b \wedge \sim c)\vee \\ ((((\sim a \vee b)\wedge a)\vee ((\sim a \vee b)\wedge \sim b))\wedge c)\\ =(a\wedge \sim b \wedge \sim c) \vee (\sim a \wedge b \wedge \sim c)\vee (a \wedge b \wedge c) \vee (\sim a \wedge \sim b \wedge c) (ab)c=((ab)(ab))c=(((ab)(ab))c)((((ab)(ab)))c)=(((ab)(ab))c)(((ab)(ab))c)=(abc)(abc)((((ab)a)((ab)b))c)=(abc)(abc)(abc)(abc)

  同理可证:

a ⊕ ( b ⊕ c ) = ( a ∧ ∼ b ∧ ∼ c ) ∨ ( ∼ a ∧ b ∧ ∼ c ) ∨ ( a ∧ b ∧ c ) ∨ ( ∼ a ∧ ∼ b ∧ c ) a\oplus (b\oplus c) \\= (a\wedge \sim b \wedge \sim c) \vee (\sim a \wedge b \wedge \sim c)\vee (a \wedge b \wedge c) \vee (\sim a \wedge \sim b \wedge c) a(bc)=(abc)(abc)(abc)(abc)

  证明就结束了。

  其实从更本质的角度上讲,存在一种特殊的环结构,叫做布尔环,它满足x+x = 0(是不是很像a^a = 0),x*x=x(是不是很像&),并且在有定理可以保证我们从一个布尔代数可以唯一的构造出一个布尔环(其定义方法就是把布尔环加法定义成异或,布尔环的乘法定义成)、从一个布尔环可以唯一的构造出一个布尔代数(布尔代数的定义成布尔环的乘法,把布尔代数的非~x定义成x+1,把布尔代数的定义成x+y+x*y),也就是说,布尔环和布尔代数具有一种一一对应的关系

  而我们知道,环是一种满足加法乘法交换律、加法乘法结合律、乘法分配律的代数结构。所以从这个角度讲,我们定义的异或运算可以对应布尔环中的加法,自然异或是满足交换律的。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值