【问题标题】:How does the bitwise operator XOR ('^') work?按位运算符 XOR ('^') 是如何工作的?
【发布时间】:2011-02-10 02:55:00
【问题描述】:

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

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

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

【问题讨论】:

  • 你是问运营商是如何工作的,还是swap是如何工作的?
  • @Sebastian P,我知道了。谢谢。
  • 仅供参考:如果字符串包含不同数量的字符,则会被截断

标签: php bitwise-operators


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

    • PHP 是动态类型的并且讨厌字符串 - 只要机会出现,它就会将它们转换为 int 或 double。
    • @Michael:感谢您指出这一点-我不知道,只是假设发生了这样的事情^^
    【解决方案3】:

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

    "a" ^ "b"
    

    等同于:

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

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

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

    因为:

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

    chr(87) == "W"
    

    【讨论】:

      【解决方案4】:

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

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

      例如:

      100110110 ^ 010001100 = 110111010

      【讨论】:

      • 在问题的示例代码中,操作数是字符串。实际发生了什么?例如,是否使用了 ASCII 值?如果字符串长于一个怎么办?
      【解决方案5】:

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

      a   = 1100
      b   = 1010
      xor = 0110
      

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

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

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

      【讨论】:

        【解决方案6】:

        XOR或独占or是基于逻辑和电路的。它表示,例如,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(参考上面提到的交换能力。

        【讨论】:

          猜你喜欢
          • 2013-08-16
          • 2011-08-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-21
          • 2014-01-27
          • 2017-02-27
          相关资源
          最近更新 更多