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
。
有人可以向我解释为什么这等于 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
。