2014-08-31 89 views
2

這次是關於LShift。爲什麼在Javascript和PHP中LShift(<<)不一樣?

在Javascript中:

document.write((1732584193 << 5)+"<br />"); 
document.write((125 << 5)+"<br />"); 

輸出:

-391880672 
4000 

在PHP:

echo (1732584193 << 5)."<br />"; 
echo (125 << 5)."<br />"; 

輸出:

55442694176 
4000 

隨着小數字的一切正常,但大整數不起作用,爲什麼?

回答

10

這是因爲您使用的是64位版本的php。在32位系統上,結果將是相同的。

這是一個32位系統上的位會發生什麼:

source number: 01100111010001010010001100000001 
first shift: 11001110100010100100011000000010 
2nd:   10011101000101001000110000000100 
3rd:   00111010001010010001100000001000 
4th:   01110100010100100011000000010000 
5th:   11101000101001000110000000100000 

前5位丟失,最後一個號碼的最左邊位設置,所以它的消極對待。在64位的圖像是不同的:

source: 0000000000000000000000000000000001100111010001010010001100000001 
shifted: 0000000000000000000000000000110011101000101001000110000000100000 

在PHP中,整數是平臺相關的(32/64位),使用Javascript總是使用32位整數用於位運算。

要模擬64位系統上的32位移位,請將結果左移32位,然後再移回右移。這將刪除額外的位,並導致符號位傳播:

$a = 1732584193; 

$b = $a << 5; 
$c = (($a << 5) << 32) >> 32; 

echo $a, "\n"; # 1732584193 
echo $b, "\n"; # 55442694176 
echo $c, "\n"; # -391880672 
+0

我想使用64位PHP是否有可能使它? – 2014-08-31 00:16:32

+0

謝謝你的幫助! – 2014-08-31 00:56:15