Сила XOR.

Вы когда нибудь использовали XOR для вашего кода? наверняка нет, ну или все ограничивалось лабами в универе. Сегодня я покажу вам такой лайфхак, от которого у вас отвиснет челюсть! 😱😎

Вашему вниманию представляется тождество через XOR

a ^ b ^ b == a

Если перевести на более читаемый вид

a взаимно исключает b и взаимно исключает b это a

Если еще более человечески то можно интерпретировать как

Минус на минус дает плюс

Также, если убрать из этого тождества a - то получим 0 b^b == 0

Такое утверждение также верно a ^ 0 = a

А теперь к практической части:

Обмен переменных без 3-й переменной Если нам надо поменять переменные местами, то обычно мы используем третью переменную. Получая что-то такое let a = 69 let b = 420

let c = a a = b; b = с;

А что, если мы не используем вспомогательую переменную, то будет как-то так

let a = 69 let b = 420

a ^= b; // a = 69 ^ 420 b = 420 b ^= a; // a = 69 ^ 420 b = 420^69^420 = 69 a ^= b; // a = 69 ^ 420 ^ 69 = 420 b = 69

поиск дубликатов Помните эти задачи из собеседований, где надо найти дубликат в массиве чисел? Так вот представим себе такой массив. Дубликат будет равен следующему тождеству (1 ^ 2 ^ 3 ^ 4 ^ 5) XOR (1 ^ 3 ^ 4 ^ 2 ^ 2) // ^ array length ^ array items

Но будьте осторожны, это решение является таковым в частном виде!

XOR Linked List Этот трюк заставил сделать segfault во время его выполнения!

А если серьезно, то реальное применение XOR - двойной связный список, где у нас есть ограничение по памяти. Он так и навывается XOR Linked List - A Memory Efficient Doubly Linked List. Поскольку мы можем не хранить все ссылки на предыдущий и след. элементы, а как их исключение между собой. https://www.geeksforgeeks.org/dsa/xor-linked-list-a-memory-efficient-doubly-linked-list-set-1/