或者,一种基于二进制的位运算,由符号XOR或^表示,其中运算符两侧数的每个位的等值取0,等值取1。 与布尔运算的区别在于,如果运算符两侧为1,则布尔运算的结果为1,异或运算的结果为0。
简单来说,就是不进位的加法,例如1 1=0,00=0,10=1。
性质
1、交换规律
2、结合律(即(a^b ) c==a ^ (b ^ c ) ) )
3、对于任何数量x,都有x^x=0、x^0=x
4、自反性A XOR B XOR B=A xor 0=A
异或运算在多项式除法运算中最常见,但最重要的性质是自反性。 A XOR B XOR B=A,即对于给定的数a,用同一运算符(b )进行两次异或运算也能得到a本身。 这是一个不可思议的性质,利用这个性质,可以得到很多有趣的应用。 例如,所有程序教科书都指出,要交换两个变量的值,必须引入中间变量。 但是,使用异或可以节省变量的存储空间。 如果有a、b两个变量,分别存储a、b的值,则以下三行公式交换值表达式(值)。
a=axorb(axorb ) )。
b=bxora(bxoraxorb=a ) ) )。
a=axorb(axorbxora=b ) ) )。
同样,该运算可应用于加密、数据传输、验证等多个领域。
运行距离:
1-1000排列成包含1001个元素的数组,只有唯一的元素值重复,其他只出现一次。 数组元素只能访问一次。 设计算法,找到它。 是否可以在不使用辅助存储空间的情况下设计算法实现?
zrdlr,显然已经提出了很棒的解法。 请把所有的数加起来,减去1(2)…1000之和。 这个算法足够完美,我相信出题人的标准答案就是这个算法。 唯一的问题是数列太大可能会溢出。 霸气储物柜,异或没有这个问题,性能更好。 对所有数进行异或,对得到的结果和1^2^3^.^1000的结果进行异或,得到的结果为重复数。 虽然这个算法很简单,但要证明并不是一件容易的事。 这与异或运算的一些特性有关。 首先是异或运算满足交换律、结合律。 因此,无论这两个n出现在哪个位置,1^2^.^n^.^n^.^1000都可以转换为1^2^.^1000^(n^n )的形式。 其次,对于任何数x,都有x^x=0、x^0=x。 因此,1 ^2^ . ^ n ^ . ^ n ^ . ^ 1000=1^2^ . ^ 1000 ^ (n ^ n )=1^2^.^1000^0=1^2^.^1000 t^(t^n )=n。 所以,取所有数异或得到的结果和1^2^3^.^1000的结果异或得到的结果就是重复数。 当然,也有人说1(2) ) 1000的结果有高斯定律,所以可以快速计算,但实际上1^2^…) ^1000的结果也有定律,算法要比高斯定律简单得多。 谷歌问题变形:一个数组包含几个整数。 一个数出现奇数次,剩下的数出现偶数次。 找到这个奇数次出现的次数吗? 解法有很多,最好的是和上面一样,把所有的数异或,最后的结构是找。 原理是一样的。 http://longzxr.I.Sohu.com/blog/view/190676432.htm奇数个或其本身,偶数个为0; 0^a=a; 异或有交换法