views:

208

answers:

5

I'm a little confused when I see the output of following code:

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

And I wonder how does the operator ^ work here?Explanations with clarity would be greatly appreciated!

+4  A: 

This looks like swapping a value using xor. Thought I am not sure about the strings in php (normally you use it for ints or something). For a truth table of xor you can look here.

The interesting about xor is, that it is reversable: A xor B xor B == A ... that is not working with and or or. Because of this fact it can be used as in your example to swap two values:

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

means:

$x = $x ^ $y
$y = $y ^ ($x ^ $y)                // = $x
$x = ($x ^ $y) ^ ($y ^ ($x ^ $y))  // = $y
tanascius
PHP is dynamically typed and hates strings - it will convert them to int or double whenever an opportunity presents itself.
Michael Borgwardt
@Michael: Thanks for pointing this out - I didn't know it and just assumed that something like this happens ^^
tanascius
+3  A: 

Th ^ operator is a bitwise operator, meaning that it operates on every bit of its operands.

It returns a value in which each bit is 1 if the two corresponding bits in the operands are unequal, and 0 if they're equal.

For example:

   100110110
 ^ 010001100   
 = 110111010
SLaks
+1  A: 

In this example when you using ^ characters are casted to integers. So

"a" ^ "b"

is the same as:

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

with one exception. In first example result casted back to string. For example:

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

because of:

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

and

chr(87) == "W"
dotsid
+4  A: 

^ is the "exclusive or" bitwise operator. It reads in English as "either or". The result is 1 if and only if both bits differ:

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

Simplifying the example a bit so (and using Pseudo code):

$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

All that PHP has done is treat the string "a" and "b" as their integer equivalents.

Yacoby
+1  A: 

The ^ operator performs an XOR on the bit values of each variable. XOR does the following:

a   = 1100
b   = 1010
xor = 0110

x is the result of the XOR operation. If the bits are equal the result is 0 if they are different the result is 1.

In your example the ^= performs XOR and assignment, and you swap the bits around between the two variables $x and $y.

Read more here http://en.wikipedia.org/wiki/Xor_swap_algorithm

Justin