2010-03-17 139 views
3

我有以下問題:PHP按位左移32位問題,並有大量的算術運算壞的結果

第一:我試圖做一個32位按位上留下了大量的變化,而對於一些原因是該號碼總是按原樣返回。例如:

echo(516103988<<32); // echoes 516103988 

由於比特向左移位一個空間是乘以2的等同物,我試圖除以2^32的數目乘以,和它的工作原理,它返回2216649749795176448.

二:我必須從上面加點到9379的數量:

printf('%0.0f', 2216649749795176448 + 9379); // prints 2216649749795185920 

應打印:2216649749795185827

回答

4

基於帕斯卡·馬丁的建議,我嘗試了bcmath時和GMP延伸都與以下解決方案上來:

隨着bcmath時:

$a = 516103988; 
$s = bcpow(2, 32);  
$a = bcadd(bcmul($a, $s), 9379); 
echo $a; // works, echoes 2216649749795185827 

符合GMP:

$a = gmp_init(516103988); 
$s = gmp_pow(gmp_init(2), 32); 
$a = gmp_add(gmp_mul($a, $s), gmp_init(9379)); 
echo gmp_strval($a); // also works 

從我所瞭解的情況來看,BCMath在服務器上安裝GMP的可能性要大得多,因此我將使用第一種解決方案。

謝謝:)

+0

不要忘了接受你最喜歡的 – user187291 2010-03-17 12:17:54

+0

我打算接受我的答案在頂部爲今後遊客:) – 2010-03-17 12:24:05

+0

到別針把它的答案我會說這是完全有道理的在這種情況下,因爲你提供了一個很好的總結。 – user187291 2010-03-17 12:48:14

4

做32位移位操作將大概沒有t就像你期望的那樣工作,因爲整數傾向於存儲在32位上。

引用此頁面:Bitwise Operators

做32個系統上超過32 位不右移。
如果結果爲 長度超過32位,請不要離開 。
使用gmp擴展中的函數 對 PHP_INT_MAX以外的數字進行按位操作 。

4

Php整數精度限於機器字大小(32,64)。要以任意精度的整數工作,你必須將它們存儲爲字符串,並使用bc或GMP庫:

echo bcmul('516103988', bcpow(2, 32)); // 2216649749795176448