Какова цель оператора «^ =» в Java? - PullRequest
5 голосов
/ 17 октября 2019

Я учился на leetcode для интервью. Возник вопрос о поиске недостающего номера в массиве. Я решил это с помощью HashSet. Но я видел приведенное ниже решение, которое более эффективно, чем мое. Мой вопрос в том, что означает логика XOR a ^= nums[i]?

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

Ответы [ 6 ]

9 голосов
/ 17 октября 2019

^ Побитовое исключающее ИЛИ или XOR

Он будет проходить по всем элементам вашего массива и будет выполнять операцию XOR над всеми элементами. Это форма составного присваивания в Java.

a ^= nums[i]

, что эквивалентно

a = a ^ nums[i]
9 голосов
/ 17 октября 2019

Теперь вы знаете по всем ответам, что ^= является оператором XOR и становится.

Когда 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
5 голосов
/ 17 октября 2019

^ Битовое исключающее ИЛИ

(из здесь )

Таким образом:

x ^= y;

просто "ярлык "для:

x = x ^ y;
3 голосов
/ 17 октября 2019

Оператор ^ - это битовое исключающее ИЛИ .

И, конечно, a ^= b эквивалентно a = a ^ b.

Что за что? побитовое исключающее ИЛИ "означает, см., например, Википедия :

Результат в каждой позиции равен 1, если только первый бит равен 1 или только второй бит равен 1, но будет0, если оба равны 0 или оба равны 1.

1 голос
/ 17 октября 2019

^ - это битовый оператор 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).

1 голос
/ 17 октября 2019

Побитовый XOR оператор.
a ^ = nums [i] - сокращенное обозначение.
Вы можете написать его как a = a ^ nums [i]


int a = 0;
    for (int i = 0; i < nums.length; i++) {
        a = a ^ nums[i];
    }
    return a;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...