位运算符异或('^')是如何工作的?

27

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

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

这里运算符^是如何工作的?


3
在https://dev59.com/o3VC5IYBdhLWcg3wliGe中已经回答。 - Sebastian Paaske Tørholm
你是在问运算符如何工作还是交换操作如何工作? - SLaks
3
了解:如果字符串包含不同数量的字符,它们将被截断。 - Geo
6个回答

23

^ 是“异或”(exclusive or) 位运算符。它的英文读音为“either or”。当且仅当两个二进制位不同时,结果为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"视为它们的整数等价物。


13
这段文字似乎是使用异或运算交换值。虽然我不确定 PHP 中的字符串(通常用于整数或其他类型)。如果需要 XOR 的真值表,可以在这里查看
有趣的是,XOR 可以被反转:A 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

5
PHP是动态类型语言,不喜欢字符串 - 只要有机会,它就会将其转换为整数或双精度浮点数。 - Michael Borgwardt
@Michael:感谢您指出这一点——我不知道,只是假设会发生类似的事情^^ - tanascius

7
在这个例子中,当你使用^字符时,它们会被转换为整数。因此,
"a" ^ "b"

与以下代码相同:

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

只有一个例外。在第一个例子中,结果被转换为了字符串。例如:

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

因为:

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

并且

chr(87) == "W"

6

^运算符是一个位运算符,意味着它作用于操作数的每一位。

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

例如:

   100110110
 ^ 010001100   
 = 110111010

在问题的示例代码中,操作数是字符串。实际上会发生什么?例如,是否使用ASCII值?如果字符串超过一个字符会怎样? - Peter Mortensen

1

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

a   = 1100
b   = 1010
xor = 0110

x是异或操作的结果。如果位相等,则结果为0,如果不同,则结果为1。

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

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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接