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