异或运算的性质:

异或运算是基于二进制的位运算,采用符号XOR或者^来表示,运算规则是就与二进制,如果是同值取0、异值取1。

性质:

  1. 交换律 可以任意交换运算因子,结果不变。如:a ^ b = b ^ a
  2. 结合律 (a^b)^c=a^(a^c)
  3. 对于任何数x,都有x^x=0,x^0=x,同自己求异或运算为0,同0求异或运算结果为自己
  4. 自反性,A^B^B=A^0=A。这个性质可以用来求哪一个数为一个(异或运算最常见于多项式除法,不过它最重要的性质还是自反性:A XOR B XOR B = A,即对给定的数A,用同样的运算因子(B)作两次异或运算后仍得到A本身。这是一个神奇的性质,利用这个性质,可以获得许多有趣的应用。)

前几天看到一个这样的题目,对于一个有多个数值的数组,只有一个是唯一的,其他都是成对的,怎样快速找到这个唯一值。在我没听过异或运算的时候,真是一脸懵,但是后来在看hashMap源码的时候看到了^ 异或运算符,搜了一下,才发现曾经看到的这道题的解题,顿时豁然开朗。

int[] numarry = new int[]{1,2,3,2,3};
        int aim = numarry[0];
        for(int i = 1; i < 5; i++)
        {
            aim = aim ^ numarry[i];
        }
        System.out.println("最后:"+aim);

对于1^2^3^2^3 这样的异或运算,我们换一下位置(2^2)^(3^3)^1 ,通过两个相同的数进行异或运算得到0 ,那最终就会是0^0^1 ,最后会得到1 。
 

另外,还看到一个差不多的题,如下:
  1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次。每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间,能否设计一个算法实现?
上边这个也可以用异或运算进行解题:
假设:1^2^3......^n.....^1000=T
而: 1^2^3......^n^n.....^1000 = T^n
我们已经知道T^T^n = 0^n = n这样的过程。
所以,我们对于上边的解题办法就有了:
首先对1到1000,这1000个数进行异或运算,然后再把上边的1001个数进行疑惑运算,最后,再对这两个结果进行异或运算,就会得到唯一的那个n。