Я столкнулся со следующей проблемой на codility.com, и решение оказалось таким простым. Так вот, сегодня я узнал…

Задача:
Дан непустой массив A с нулевым индексом, состоящий из N целых чисел. Массив содержит нечетное количество элементов, и каждый элемент массива может быть сопряжен с другим элементом, имеющим такое же значение, за исключением одного элемента, который не имеет пары. Каково значение непарного элемента?

Решение:

int solution(vector<int> &A) {
 int odd1 = 0;
 for(int i=0; i < A.size(); i++) {
    odd1 ^= A[i];
 }
 return odd1;
}

Это простая функция C++, например. если вы введете простой массив, такой как [3,7,3], то ясно, что результат равен 7, поскольку он нечетный.
Что такое XOR? Возьмем два бита и применить между ними операцию XOR (^). Если оба бита одинаковы (1 и 1 ИЛИ 0 и 0), то результат равен 0, однако если толькоодин из двух битов равно 1, то результат равен 1. Вы можете быть живым (1) или мертвым (0), но не обоими одновременно, если только вы не кот в мысленном эксперименте по квантовой физике.

Вернемся к нашему примеру с массивом [3,7,3] и применим его в нашей функции выше:

// Bearing in mind that we have an initial odd integer of 0, the first for loop iteration becomes:
0 0 0 0     Decimal = 0
0 0 1 1     Decimal = 3
-------
0 0 1 1     XOR Result: Decimal = 3
// Second loop
0 0 1 1    Decimal = 3
0 1 1 1    Decimal = 7
-------
0 1 0 0    XOR Result: Decimal = 4
// Third and final loop
0 1 0 0    Decimal = 4
0 0 1 1    Decimal = 3
-------
0 1 1 1   XOR Result: Decimal = 7
Therefore our XOR result: 3 XOR 7 XOR 3 = 7

Полезность ворот XOR? Подумайте о двух выключателях для одной лампочки.