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


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

//异或的定义
对二进制位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。

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

题解:

  但是问题就出现了,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∨aa∧(b∨c)=(a∧b)∨(a∧c)a∨(b∧c)=(a∨b)∧(a∨c)a∨0=a,a∧1=aa∨(∼a)=1,a∧(∼a)=0a \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 a∧b=b∧a,a∨b=b∨aa∧(b∨c)=(a∧b)∨(a∧c)a∨(b∧c)=(a∨b)∧(a∨c)a∨0=a,a∧1=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) a⊕b=(a∧∼b)∨(∼a∧b)

  这个定义是自然的,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) (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⊕(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⊕(b⊕c)=(a∧∼b∧∼c)∨(∼a∧b∧∼c)∨(a∧b∧c)∨(∼a∧∼b∧c)

  证明就结束了。

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

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

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

  1. 巧解异或操作的逆运算——位运算结合律

    x XOR y = z 已知y.z,求解x 利用 1. x XOR x = 0 的特性 2.异或运算的结合律 x XOR y XOR y = x XOR (y XOR y) = x XOR 0 = x ...

  2. 经典算法之异或运算(无进位相加)

    目录 异或运算的定义 异或运算的性质 异或运算的应用 交换两数 翻转指定位 寻找单身狗 异或运算的定义 众所周知,计算机中的所有数据都是以二进制(0或者1)的形式存储.而异或运算符(^)就是将参加运算 ...

  3. 100个白球100个黑球,取出两个球,同色则补充黑色,异色则补充白色。最后剩什么颜色

    [题目描述] 桶中取黑白球 有一个桶,里面有白球.黑球各100个,人们必须按照以下规则把球取出来: 1.每次从桶中那两个球 2.如果是两个同色的球,那就再放入一个黑球 3.如果是两个异色的球,那就再放 ...

  4. 异或交换两个数的原理证明

    算法 通过异或运算交换两个数     a ^= b     b ^= a     a ^= b 证明 由异或定义易得:     异或运算满足结合律, 交换律     x ^ x = 0     x ^ ...

  5. 异或的妙用(C语言)

    文章目录 题目一 题目二 按位异或 是在二进制位上的运算: 一句话概括,就是 同为0,异为1. 0 ^ 0 = 0 1 ^ 1 = 0 0 ^ 1 = 1 1 ^ 0 = 1 异或有何用?有妙用.有何 ...

  6. Python异或运算符示例

    目录 异或 异或的性质 示例1:值交换 示例2:找出现一次的元素 示例2代码: 异或 英文为exclusive OR,缩写成xor,符号是^ a b a^b 0假 0假 0假 0假 1真 1真 1真 ...

  7. C语言异或操作详解(小小异或,大大作用~)

    文章目录 *按位异或"^" (1)何为"^": ①"^"的介绍 (2)用于算法的经典案例: 1.数组nums包含从0到n的所有整数,但其中缺 ...

  8. 《深入理解计算机系统原理》学习笔记与习题答案(一)

    第一章计算机系统漫游 比较基础广泛,后面有空补上. 第二章 信息的表示和处理 首先需要理解计算机当中的位的概念. 位:在二进制数系统中,位记为b,即比特,是最小的存储单位.0/1中每一位是1 bit ...

  9. 用按位异或运算符交换两个数,不引入第三个变量

    2019独角兽企业重金招聘Python工程师标准>>> 用按位异或运算符交换两个数,不引入第三个变量 void swap(int &a , int &b) { a = ...

  10. 位运算在一类数组题中的用法 只出现一次的数字I

    文章目录 前言 复习 一:只出现一次的数字I 二:只出现一次的数字II 二:只出现一次的数字III 前言 LeetCode上有几道题特别相似,分别是leetcode 136只出现一次的数(简单),13 ...

最新文章

  1. 也谈游戏--魔兽和星际的区别
  2. centos mysql卸载重装_centos 7.x 安装/卸载MySQL
  3. 经验总结:按需加载JS和css
  4. SAP CRM WebClient UI 培训教程
  5. 做点RouteOS方面的备忘,关于流量监控限速的
  6. 理解Android安全机制
  7. CentOS下安装实时检测网络带宽的小工具bmon
  8. python中哪些词是敏感字词_敏感词库(收集2017年最新最全敏感词) 2017 最新版
  9. SAS入门教程1---SAS系统简介
  10. 吗 极域软件可以装win10_关于win10企业版在极域电子教室软件 v4.0 2015 豪华版的全屏控制下如何取得自由...
  11. cfa英语不好的怎么学_没有英语基础,怎么学cfa?
  12. matlab imcrop 对应python函数_MATLAB车牌识别之车牌精准定位浅谈
  13. JSP项目进度管理系统myeclipse开发mysql数据库web结构java编程
  14. 电子商务网站设计与实现
  15. Vue项目实战 —— 后台管理系统( pc端 )
  16. oracle sys_context()函数
  17. 嵌入式-ARM-学习总结(7):按键与中断
  18. 数据挖掘(一)你真的了解什么是数据挖掘和数据本身吗?
  19. 自动语音对话系统 Python实现
  20. Python 3 字符串 encode( ) 方法

热门文章

  1. IntelliJ IDEA运行内存设置
  2. 欢迎来到whai的博客
  3. 如何在百度和各大网站搜索到自己的文章
  4. C# 利用 OleDb 组件操作 Excel 进行文件读写操作
  5. python pyd 速度提升_pyd打包补充
  6. java作品欣赏_[Java教程]推荐25个强大的 jQuery 网页布局设计作品欣赏
  7. 0-glusterfs: failed to set volfile server: File exists
  8. dejavu中如何添加html文件,【dejavu Chrome插件图文介绍】dejavu Chrome插件图片教程 - 开发者插件 - Chrome插件网...
  9. 1、 域名系统的主要功能是什么?互联网的域名结构是怎样的?域名系统中的本地域名服务器、根域名服务器、顶级域名服务器以及权限域名服务器有何区别?2、 假定要从已知的URL获得一个万维网文档。若该万维网服
  10. fixed定位失效问题如何解决