Как работает побитовый оператор XOR ('^')?

Я немного смущен, когда вижу результат следующего кода:

$x = "a"; $y = "b"; $x ^= $y; $y ^= $x; $x ^= $y; echo $x; //Got b echo $y; //Got a 

Как работает здесь оператор?

Это похоже на замену значения с помощью XOR . Хотя я не уверен в строках в PHP (обычно вы используете его для ints или что-то еще). Для таблицы истинности XOR вы можете посмотреть здесь .

Интересная вещь о XOR заключается в том, что она обратима: XOR B XOR B == A …, которая не работает с AND или OR . Из-за этого его можно использовать, как в вашем примере, для замены двух значений:

 $x ^= $y; $y ^= $x; $x ^= $y; 

означает:

 $x = $x ^ $y $y = $y ^ ($x ^ $y) // = $x $x = ($x ^ $y) ^ ($y ^ ($x ^ $y)) // = $y 

^ является «эксклюзивным» или «побитовым» оператором. Он читается на английском языке как «либо или». Результат равен 1 тогда и только тогда, когда оба бита отличаются:

 1 ^ 0 = 1 1 ^ 1 = 0 0 ^ 0 = 0 

Упростите пример бит так (и используя псевдокод):

 $x = 0011 //binary $y = 0010 $x = $x xor $y //Result: x = 0001 //x = 0001 //y = 0010 $y = $y xor $x //Result: y = 0011 //x = 0001 //y = 0011 $x = $x xor $y //Result: x = 0010 

Все, что сделал PHP, обрабатывают строки «a» и «b» как их целочисленные эквиваленты.

Оператор Th ^ является поразрядным оператором, что означает, что он работает с каждым битом его операндов.

Он возвращает значение, в котором каждый бит равен 1 если два соответствующих бита в операндах не равны, и 0 если они равны.

Например:

    100110110
  ^ 010001100   
 = 110111010

В этом примере, когда вы используете символы ^, они отливаются целыми числами. Так

 "a" ^ "b" 

такой же как:

 ord("a") ^ ord ("b") 

за одним исключением. В первом примере результат был возвращен в строку. Например:

 "a" ^ "6" == "W" 

из-за:

 ord("a") ^ ord("6") == 87 

а также

 chr(87) == "W" 

Оператор ^ выполняет XOR по битовым значениям каждой переменной. XOR делает следующее:

 a = 1100 b = 1010 xor = 0110 

x – результат операции XOR. Если биты равны, результат равен 0, если они отличаются друг от друга, результат равен 1.

В вашем примере ^ = выполняет XOR и присваивание, и вы обмениваете биты между двумя переменными $ x и $ y.

Подробнее здесь http://en.wikipedia.org/wiki/Xor_swap_algorithm

XOR или эксклюзивный или основан на логике и схемах. Это указывает на то, что, например, A ^= B где A равно 0111, а B – 0101, может быть либо 1, либо 0 в каждом соответствующем бите, но не оба. Следовательно

 A = 0111 B = 0101 _____ ^= 0010 

Чтобы лучше понять это, применяются правила бинарной математики, за исключением того, что нет переносов. Таким образом, в двоичной математике 1 + 0 = 1, 0 + 0 = 0, 0 + 1 = 1 и 1 + 1 = 0 (где a 1 переносится в следующую более значимую позицию в бинарной математике, но правила XOR обходят это ).

Примечание. Таким образом, правила XOR позволяют взять результат A ^ = B в приведенном выше примере и добавить A к нему, чтобы получить B или добавить B к нему, чтобы получить A (ссылаясь на упомянутую выше возможность обмена.