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
How does the operator ^
work here?
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
How does the operator ^
work here?
^ is the "exclusive or" bitwise operator. It reads in English as "either or". The result is 1 if and only if both bits differ:
Simplifying the example a bit so (and using Pseudo code):
All that PHP has done is treat the string "a" and "b" as their integer equivalents.
This looks like swapping a value using XOR. Though 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 thing about
XOR
is that it is reversable: A XOR B XOR B == A ... that is not working withAND
orOR
. Because of this fact, it can be used as in your example to swap two values:means:
The ^ operator performs an XOR on the bit values of each variable. XOR does the following:
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
In this example, when you're using ^ characters, they are casted to integers. So
is the same as:
with one exception. In the first example, the result was casted back to a string. For example:
because of:
and
XOR
or the exclusive or is based on logic and circuits. It indicates that, for example,A ^= B
where A is 0111 and B is 0101 can be either 1 or 0 at each corresponding bit but not both. ThereforeTo understand this better the rules of binary math apply except that there are no carry overs. So in binary math 1 + 0 = 1, 0 + 0 = 0, 0 + 1 = 1 and 1 + 1 = 0 (where a 1 is carried over to the next more significant position in binary math, but the XOR rules bypass this).
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, and0
if they're equal.For example: