2016-07-31 87 views
-1

有人可以向我解释为什么这相当于32PHP /按位运算符左移

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

输出:

我读了manual并发现<<有点左移,但仍然没有十分把握的概念。

+0

请参阅:http://stackoverflow.com/q/3737139/3933332和http://php.net/manual/en/language.operators.precedence.php – Rizier123

+1

这与'(4 <<(2) + 1))':[https://eval.in/614829](https://eval.in/614829)。 – FirstOne

+0

请不要在问题中发布答案作为编辑;)。我已经为你发布了一个答案^^(我很快会删除这条评论) – FirstOne

回答

2

如果我们把问题分成几个步骤,就很容易了。我将首先解释这个问题,任何达成这个问题的人都会明白这一点。最后,你可以看到提到你的问题。


开始:

$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