Как работает побитовый оператор XOR ('^')? - PullRequest
24 голосов
/ 20 апреля 2010

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

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

Как работает оператор ^?

Ответы [ 6 ]

20 голосов
/ 20 апреля 2010

^ - битовый оператор "исключительный или". На английском это читается как «или». Результат равен 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" как их целочисленные эквиваленты.

11 голосов
/ 20 апреля 2010

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

Интересно, что XOR является обратимым: A 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
7 голосов
/ 20 апреля 2010

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

"a" ^ "b"

совпадает с:

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

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

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

из-за:

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

и

chr(87) == "W"
6 голосов
/ 20 апреля 2010

Th ^ - побитовый оператор, означающий, что он работает с каждым битом своих операндов.

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

Например:

   100110110
 ^ 010001100   
<b> = 110111010</b>
1 голос
/ 20 апреля 2010

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

a   = 1100
b   = 1010
xor = 0110

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

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

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

0 голосов
/ 07 июня 2014

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 (где 1 переносится на следующую более значимую позицию в двоичной математике, но правила XOR обходят это ).

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

...