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

You*_*ung 24 php bitwise-operators

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

$x = "a";
$y = "b";
$x ^= $y;
$y ^= $x;
$x ^= $y;
echo $x; //Got b
echo $y; //Got a
Run Code Online (Sandbox Code Playgroud)

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

Yac*_*oby 20

^是"独占或"按位运算符.它用英语读作"或者".当且仅当两个位不同时,结果为1:

1 ^ 0 = 1
1 ^ 1 = 0
0 ^ 0 = 0
Run Code Online (Sandbox Code Playgroud)

稍微简化示例(并使用伪代码):

$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
Run Code Online (Sandbox Code Playgroud)

PHP所做的就是将字符串"a"和"b"视为它们的整数等价物.


tan*_*ius 11

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

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

$x ^= $y;
$y ^= $x;
$x ^= $y;
Run Code Online (Sandbox Code Playgroud)

手段:

$x = $x ^ $y
$y = $y ^ ($x ^ $y)                // = $x
$x = ($x ^ $y) ^ ($y ^ ($x ^ $y))  // = $y
Run Code Online (Sandbox Code Playgroud)

  • PHP是动态类型并且讨厌字符串 - 只要机会出现,它就会将它们转换为int或double. (5认同)

Den*_*nov 7

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

"a" ^ "b"
Run Code Online (Sandbox Code Playgroud)

是相同的:

ord("a") ^ ord ("b")
Run Code Online (Sandbox Code Playgroud)

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

"a" ^ "6" == "W"
Run Code Online (Sandbox Code Playgroud)

因为:

ord("a") ^ ord("6") == 87
Run Code Online (Sandbox Code Playgroud)

chr(87) == "W"
Run Code Online (Sandbox Code Playgroud)


SLa*_*aks 6

^运营商是位运算符,这意味着它在它的操作数的每一位操作.

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

例如:

   100110110
 ^ 010001100   
 = 110111010