Java中“ ^=”运算符的目的是什么?




algorithm data-structures (4)

^按位异或

(从 here

从而:

x ^= y;

仅仅是以下内容的“捷径”:

x = x ^ y;

我正在学习leetcode进行面试。 关于查找数组中未配对的缺失编号存在一个问题。 我通过使用HashSet解决了它。 但是我看到以下解决方案比我的解决方案更有效。我的问题是 a ^= nums[i] 的逻辑XOR是什么意思?

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

^按位异或或

它会遍历数组的所有元素,并对所有元素执行XOR操作,这是Java中复合赋值的一种形式。

a ^= nums[i]

相当于

a = a ^ nums[i]

现在,您对所有答案都很熟悉,即 ^= 是XOR-and-becomes运算符。

由于 x ^ x == 0和x ^ 0 == x, 执行累积XOR运算将删除两次出现的重复项,并且结果将是唯一的一次出现。

3 ^ 5 ^ 3 ^ 7 ^ 5 = (3 ^ 3) ^ (5 ^ 5) ^ 7 = 0 ^ 0 ^ 7 = 7
3   6   5   2   7  <--- stepwise accumulated: 3=1+2, 5=1+4, 7=1+2+4

XOR是一种有趣的交换和关联函数, “位不同”, 因为它不会丢失信息,

z = x ^ y   =>   y = z ^ x

^ 按位XOR运算符

A | B | A XOR B
--+---+--------
0 | 0 |   0
0 | 1 |   1
1 | 0 |   1
1 | 1 |   0

在Java中, 化合物赋值 是应用算术(或按位运算)并将值分配给左侧变量的一种较短方法。 所以:

a ^= nums[i];

等效于:

a = a ^ nums[i];

我们利用两个相等的XOR相互抵消的事实,并通过遍历数组元素并将它们彼此XOR(初始值为0)来解决问题。





data-structures