Причина, по которой это происходит, заключается в том, что XOR не теряет информации. Вы могли бы сделать то же самое с обычным добавлением и вычитанием, если бы могли игнорировать переполнение. Например, если переменная пара A, B, первоначально содержит значения 1,2, вы можете поменять их, как это:
// A,B = 1,2
A = A+B // 3,2
B = A-B // 3,1
A = A-B // 2,1
BTW есть старый трюк для кодирования 2-полосная связанного списка в одном «указатель ». Предположим, у вас есть список блоков памяти по адресам A, B и C. первое слово в каждом блоке, соответственно:
// first word of each block is sum of addresses of prior and next block
0 + &B // first word of block A
&A + &C // first word of block B
&B + 0 // first word of block C
Если у вас есть доступ к блок А, это дает вам адрес B Чтобы добраться до C, вы берете «указатель» в B и вычитаете A и так далее. Он работает так же хорошо назад. Чтобы бегать по списку, вам нужно сохранить указатели на два последовательных блока.Конечно, вы бы использовали XOR вместо добавления/субтракции, поэтому вам не пришлось бы беспокоиться о переполнении.
Вы можете продлить это на «связанную сеть», если хотите развлечься.
Я думаю, что переменная переменных xor всасывается на ядрах с нестандартным исполнением. Каждый последующий xor имеет зависимость от записи после записи и должен ждать завершения ответа. для x86, вам лучше всего кодировать, как обычно. Компилятор должен испускать что-то приличное. – Calyth 2009-01-09 23:41:45