2016-07-31 92 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