Прежде всего рассмотрим, как работает XOR:
a | b | a^b
- - - - - -
0 | 0 | 0
1 | 0 | 1
0 | 1 | 1
1 | 1 | 0
Таким образом, результат операции исключающего является 1 или верно, если входы различны, и 0, если входы равны. Другой способ смотреть на него, чтобы думать о нем, как дополнение без переноса, я буду обозначать как (+):
x = x^y <=> x = x (+) y;
y = y^x <=> y = y (+) x;
x = x^y <=> x = x (+) y;
Первый шаг: установить все биты, которые 0 в х, но 1 в y до 1.Теперь некоторые биты ошибочны в x, потому что если бит равен 1 в x, а также y, он будет равен 0. Другие биты верны.
Второй шаг: Теперь установите одинаковые позиции бит, которые мы установили в 1 по x на 0 в y (мы закончили с y сейчас). Это работает, потому что x уже имеет все биты, которые отличаются от 1, поэтому XORing y с x теперь в основном означает: переключение битов в y, которые установлены в 1 в x. Мы закончили с y сейчас :)
Третий шаг: теперь нам по-прежнему необходимо установить эти биты в x в 1, которые уже были установлены в 1 изначально, и были сброшены на 0 после первого шага назад до 1. Как ? Мы просто XOR x с y в последний раз, потому что то, что делает xor? он устанавливает бит в 1, если два входа различаются, что именно то, что нам нужно.
Если вы все еще смущены, вы должны просто нарисовать его на бумаге и воспроизвести, чтобы увидеть, как это работает и/или обратиться к таблицам, которые сделал Джейсон выше.
Запишите операции на бумаге с примерами значений x и y в двоичном формате. – Oded
Держите его таким образом и не используйте его. Кто-нибудь будет поддерживать ваш код в один прекрасный день. Вы найдете несколько потоков под тегом C++, посмотрите на нисходящие. В противном случае напишите его с 0 и 1, чтобы увидеть, как он работает. Достаточно двух бит. –
Это был один из меняющихся трюков, который я узнал в первом классе compsci, который я взял для удовольствия. Я не мог не чувствовать себя глупо, выполняя эту микро микро оптимизацию без каких-либо оснований, тогда как очевидная альтернатива (temp = x; x = y; y = temp;) в миллион раз яснее. И, вероятно, в миллион раз легче оптимизировать компилятор. – Joren