PHP / 按位运算符左移

PHP / bitwise operators left shift

有人可以向我解释为什么这等于 32 吗?

$a = 4 << 2 + 1;
echo $a;

输出:

32

我看了manual,发现<<有点左移,但还是不太明白这个概念。

如果我们把问题分成几步,就很容易理解了。我将首先解释按位部分,以便任何遇到这个问题的人都能理解这一点。最后可以看到提到你的问题。


开始:

$v = 4;

首先我们检查该值需要多少位。

echo decbin($v); // 3 bits (100)

然后,我们将它左移两位:

echo $v << 2; // the value is now 16. Why?

因为如果我们检查位:

echo decbin($v << 2); // 5 bits (10000) -> the previous 3 bits + 2 shifted
//                                  /\ check that there are more 2 bits now


但我们得到的结果是 32,这是为什么呢?好吧,因为在这种情况下,+ 排在第一位。它首先计算和 (2+1),然后才移动。您的代码与 4 << (2 + 1).

相同

如果我们像以前一样检查步骤,但是知道它会先求和,它实际上会把它加3,使最后一个值变成6位。

如果我们将移动 3 (100000) 的值进行转换,我们将得到 32