按位运算符XOR('^')如何工作?

时间:2010-04-20 12:12:55

标签: php bitwise-operators

当我看到以下代码的输出时,我有点困惑:

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

运营商^如何在这里工作?

6 个答案:

答案 0 :(得分:20)

^是“独占或”按位运算符。它用英语读作“或者”。当且仅当两个位不同时,结果为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”视为等价整数。

答案 1 :(得分:11)

这看起来像swapping a value using XOR。虽然我不确定PHP中的字符串(通常你将它用于int或其他东西)。对于XOR的真值表,您可以look here

关于XOR的有趣之处在于它是可逆的:XOR B XOR B == A ...不适用于ANDOR。由于这个事实,它可以在您的示例中用于交换两个值:

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

表示:

$x = $x ^ $y
$y = $y ^ ($x ^ $y)                // = $x
$x = ($x ^ $y) ^ ($y ^ ($x ^ $y))  // = $y

答案 2 :(得分:7)

在此示例中,当您使用^字符时,它们将转换为整数。所以

"a" ^ "b"

与:

相同
ord("a") ^ ord ("b")

有一个例外。在第一个示例中,结果被转换回字符串。例如:

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

因为:

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

chr(87) == "W"

答案 3 :(得分:6)

Th ^运算符是一个按位运算符,意味着它对其操作数的每一位进行操作。

如果操作数中的两个相应位不相等,则返回一个值,其中每个位为1;如果它们相等,则返回0

例如:

   100110110
 ^ 010001100   
 = 110111010

答案 4 :(得分:1)

^运算符对每个变量的位值执行XOR。 XOR执行以下操作:

a   = 1100
b   = 1010
xor = 0110

x是XOR运算的结果。如果位相等,则结果为0,如果它们不同,则结果为1.

在您的示例中,^ =执行XOR和赋值,并在两个变量$ x和$ y之间交换位。

在此处阅读更多http://en.wikipedia.org/wiki/Xor_swap_algorithm

答案 5 :(得分:0)

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(参考上面提到的交换能力。