在搜索出现奇数次的整数时,编译器正在逐步执行什么操作?

What is the compiler doing step-by-step when searching for integers occurring an odd number of times?

You are given an array with random integers. All integers occur an even amount of time throughout the array except for one integer. You are able to use ^ (or XOR) to single out which integer occurs an odd number of times in the array

当运行通过这段代码时,我不明白编译器在一步步做什么。

看addition/subtraction/XOR两个二进制数比较的原理。

int[] a = {20,1,-1,2,-2,3,3,20,5,5,1,2,4,20,4,-1,-2};

int xor = 0;
for (int i = 0; i < a.length; i++){
           xor ^= a[i];
}
return xor;

在 运行 之后,上面的代码 20 将显示为出现奇数次的整数(3 次,而不是所有其他整数出现 2 次)

如果你debug,一步步调试代码,比如你存20,那么打1之后就变成21,然后打-1之后就变成-22。我不明白编译器在 21 -> -22 步骤中执行的数学运算。

关于这段代码最重要的一点是,循环中间 xor 的值是什么并不重要。您不需要知道 xor 的中间值之一是 -22。重要的是它表示数字 20、1 和 -1 处于 "odd" 状态,而其他任何东西都处于 "even" 状态(包括计数 0)。

如您所知,对同一个数字第二次使用 the XOR operator 会反转第一次操作。也就是说,(a ^ b) ^ ba。这个事实(连同 XOR 运算符的交换性)用于存储当前计数为奇数的数字。

因为我们知道只有一个出现次数为奇数的数字,所以对所有出现次数使用 XOR 运算符意味着所有出现次数为偶数的数字都将自行反转出值 xor。唯一不会自行反转的值是您正在搜索的数字。

编译器所做的只是生成字节码以使用 ^ (XOR) 运算符来操作变量 xor。算法设计者使用此运算符作为算法的一部分来确定哪个整数出现奇数次。