How does the bitwise operator XOR ('^') work?
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?
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 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
^ 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.
In this example, when you're using ^ characters, they are casted to integers. So
"a" ^ "b"
is the same as:
ord("a") ^ ord ("b")
with one exception. In the first example, the result was casted back to a string. For example:
"a" ^ "6" == "W"
because of:
ord("a") ^ ord("6") == 87
and
chr(87) == "W"
链接地址: http://www.djcxy.com/p/1774.html
上一篇: ^在PHP中意味着什么?
下一篇: 按位运算符XOR('^')如何工作?