java中异或运算的应用

  • Post author:
  • Post category:java


java中异或运算(^)的应用

异或运算法则

1. a ^ b = b ^ a

2. a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c;

3. d = a ^ b ^ c 可以推出 a = d ^ b ^ c.

4. a ^ b ^ a = b.

异或运算

1、异或是一个数学运算符。应用于逻辑运算。

2、例如:真异或假的结果是真,假异或真的结果也是真,真异或真的结果是假,假异或假的结果是假。就是说两个值相 异结果为真。

异或的运算方法是一个二进制运算:

1^1=0

0^0=0

1^0=1

0^1=1

两者相等为0,不等为1.

总之,就是这样,n^0=n n^n=0,即任何数与0进行异或,为它本身,两个相同的数进行异或运算,会得到0。

前几天看到一个这样的题目,对于一个有多个数值的数组,只有一个是唯一的,其他都是成对的,怎样快速找到这个唯一值。在我没听过异或运算的时候,真是一脸懵,但是后来在看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

,既然异或运算满足上边的交换规则,对于

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。

这里写图片描述



版权声明:本文为wohaqiyi原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。