当我看到以下代码的输出时,我有点困惑:
$x = "a";
$y = "b";
$x ^= $y;
$y ^= $x;
$x ^= $y;
echo $x; //Got b
echo $y; //Got a
运营商^
如何在这里工作?
答案 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 ...不适用于AND
或OR
。由于这个事实,它可以在您的示例中用于交换两个值:
$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之间交换位。
答案 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(参考上面提到的交换能力。