“与”运算和“或”运算大家可能比较熟悉。相对来说,“异或”运算很少用到,存在感也不强。如果不是刻意提及,你可能想不到。其实“异或”运算也很重要。它在加密、备份、算法等方面都有应用,每个开发的同学都应该花一些时间掌握它的特性和规律,以便在日常工作中灵活运用。OR运算的一些基础知识和实践中应用的一些基础知识XOR是计算机中的一种二进制逻辑运算,运算符号为^,它根据二进制位进行异或运算,结果为真或假,其运算规则为如下xyx^y000011101110表格的第一列和第二列是异或运算的两个操作数,第三列是异或运算的结果,1表示为真,0从表中可以看出,如果参与运算的两个二进制位相同,则结果为0,否则为1。换句话说,异或主要用于判断两个值是否相同。下面列出了XOR运算的重要属性。1表示真,0表示假,具体验证过程比较简单,这里省略1,一个数与自己异或总是0x^x=02,一个数与0异或总是另一个自己x^0=x3,commutativex^y=y^x4,combinedx^(y^z)=(x^y)^zcommonapplicationXORoperation本身比较简单,重点还是在应用层面,上面列出的属性都用到了判断两个数是否相等的方法很多。一个数和它自己异或,永远为0,我们可以用这个来判断两个变量是否相等(a^b)==0当a和b相等时,表达式为真,否则为假来交换两个数的值不使用临时变量,通常的方式是使用临时变量例如:tmp是一个临时变量,现在需要交换a和b的两个变量值,过程如下tmp=aa=bb=tmp;利用异或的一些性质,可以不使用临时变量,交换两个变量的数值,具体过程如下a=a^bb=a^ba=a^b如果一开始,a=1,b=2、第一个方程a=a^b结果a=1^2=3紧接着第二个方程b=a^b结果b=1^2^2=1^0=1最后一个方程a=a^b结果b=1^2^1=1^1^2=0^2=2可以看出最后a=2,b=1,他们的值交换了。以上三个语句可以进一步优化为一个,结果如下a^=b^=a^=b简化表达式根据交换性,可以优化表达式中重复变量的异或运算,例如:表达式a^b^c^a^b可以简化为a^b^c^a^b#根据x^y=y^x=(a^a)^(b^b)^c#根据x^x=0=0^0^c#根据x^0=x=c加密使用异或运算的加密是一种非常常见的加密方法,它涉及三个变量:明文、密钥和密文。如果记录为plain_text、encrypt_key、c??ipher_text并与key异或,密文plain_text^encrypt_key=cipher_text可以与key异或。或者操作,可以得到明文cipher_text^encrypt_key=(plain_text^encrypt_key)^encrypt_key=plain_text^(encrypt_key^encrypt_key)#根据x^(y^z)=(x^z)^y=plain_text^0#根据tox^x=0=plain_text备份根据异或的性质,异或运算也可以用于文件备份。现有两个文件filea和fileb,它们进行异或运算,会生成一个新的备份文件bakfilebakfile=filea^fileb根据异或的性质,可以通过bakfile和filea得到fileb,也可以通过bakfile和fileb得到filea。不管是filea还是fileb损坏,只要两个文件没有同时损坏,就可以通过未损坏的文件和bakfile文件,恢复另一个文件。当filea文件损坏时,可以通过fileb和bakfile的异或运算得到完整的filea文件fileb^bakfile=fileb^(filea^fileb)=fileb^filea^fileb#根据x^(y^z)=(x^z)^y=fileb^fileb^filea#根据x^x=0=0^filea#根据x^0=x=filea同理,当fileb文件损坏时,可以得到完整的fileb文件通过filea和bakfile的异或运算)^y=filea^filea^fileb#根据x^x=0=0^fileb#根据x^0=x=fileb求解算法题算法题来说明一下,题目如下:一个长度为n-1的升序排列数组中的所有数都是唯一的,并且每个数都在0~n-1范围内,在0~n-1范围内的n个数中只有一个数不在数组中的,请找出这个数字示例1:输入:[0,1,3]输出:2示例2:输入:[0,1,2,3,4,5,6,7,9]输出:8最快的解决方案是对数组的所有元素和0到n-1之间的整数进行异或arry[0]^arry[1]^arry[2]...^arry[n-2]^0^1^2....^(n-1)由于数组元素值的范围是从0到n-1,所有元素值都不重复,所以上面的计算公式中,从0到n-1的每个数字都会出现两次,并且只有缺失的号码只会出现一次。根据XORx^x=0的性质,相同值之间的异或运算等于0,所以公式的结果其实就是缺失的数。下面给出测试文件test.cpp。代码是用C++实现的。其他语言可以自己实现#include
