25

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

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

操作员在这里如何^工作?

4

6 回答 6

21

^ 是“异或”位运算符。它在英语中读作“非此即彼”。当且仅当两个位不同时,结果为 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”视为它们的整数等价物。

于 2010-04-20T12:21:37.267 回答
12

这看起来像使用 XOR 交换值。虽然我不确定 PHP 中的字符串(通常你将它用于整数或其他东西)。对于 XOR 的真值表,您可以查看此处

有趣的XOR是它是可逆的: A XOR B XOR B == A ... 不能与ANDor一起使用OR。由于这个事实,它可以在您的示例中用于交换两个值:

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

方法:

$x = $x ^ $y
$y = $y ^ ($x ^ $y)                // = $x
$x = ($x ^ $y) ^ ($y ^ ($x ^ $y))  // = $y
于 2010-04-20T12:17:21.863 回答
7

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

"a" ^ "b"

是相同的:

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

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

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

因为:

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

chr(87) == "W"
于 2010-04-20T12:20:49.380 回答
6

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

它返回一个值,其中每个位是1如果操作数中的两个对应位不相等,并且0它们相等。

例如:

   100110110
 ^ 010001100   
= 110111010
于 2010-04-20T12:18:42.973 回答
1

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

a   = 1100
b   = 1010
xor = 0110

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

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

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

于 2010-04-20T12:30:43.190 回答
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 规则绕过了这个)。

Note: That the XOR rules, therefore, allow you to take the result of A ^= B in the example above and add A to it to get B or add B to it to get A (referencing the swap ability mentioned above.

于 2014-06-07T03:10:21.607 回答