Я немного смущен, когда вижу вывод следующего кода:
$x = "a";
$y = "b";
$x ^= $y;
$y ^= $x;
$x ^= $y;
echo $x; //Got b
echo $y; //Got a
Как работает оператор ^
?
Я немного смущен, когда вижу вывод следующего кода:
$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 к нему get A (ссылка на упомянутую выше возможность обмена).