xor运算符找到一次出现的数字

时间:2016-04-19 21:09:59

标签: java

我不理解这个算法。

对于程序中给出的数组,如果

i = 0, num = num ^ arr[0] => num = 0 ^ 3 = 3
i = 1, num = num ^ arr[1] => num = 3 ^ 1 = 2
i = 2, num = num ^ arr[2] => num = 2 ^ 5 = 7
...etc...and the last result in num will be printed.

这里发生了什么?它是如何删除具有相同值的数字的?

此算法找到仅出现在数组中的元素,但是如何?

class Ideone {

    public static int a() {

        int arr[] = {3,1,5,1,5,3,4,7,7};
        int num = 0;

        for(int i = 0; i < arr.length; i++){
            num ^= arr[i];
        }

        return num;
    }

    public static void main (String[] args) throws java.lang.Exception {
        System.out.println(a());
    }
}

2 个答案:

答案 0 :(得分:3)

在这种情况下,XOR运算符实际上取消了出现两次的值,只留下出现一次的数字。

0 ^ 3 = 3 // first time
3 ^ 3 = 0 // second time

将XOR(&#34; exclusive或&#34;)视为删除两个值之间的共同点。 More on XOR.

答案 1 :(得分:3)

你看到效果的原因是数字的XOR本身总是产生零,而XOR的commutativity - 即你从列表中选择操作数的顺序不是这样的事实改变行动的结果。

很容易看出,如果安排你的清单

    A ^ B ^ C ^ B ^ A ^ D ^ C

以所有相同的对彼此相邻的方式

    A ^ A ^ B ^ B ^ C ^ C ^ D

您可以按如下方式对列表进行分组:

    (A ^ A) ^ (B ^ B) ^ (C ^ C) ^ D
--  -------   -------   -------
--    zero      zero      zero

因此结果是D,即原始列表中不重复的唯一值。由于XOR的可交换性,无论应用XOR的顺序如何,结果都是相同的。