Я немного смущен, когда вижу результат следующего кода:
$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 (ссылаясь на упомянутую выше возможность обмена.