2013-01-03 73 views
1

我遇到了需要在32位機器上執行< <的問題,而且這個數字已經很大了。如果我在這個大數字上轉換,答案是不正確的,我可以通過任何方式來解決這個問題?PHP在32位左移位問題

我敢肯定,筆記本電腦運行Windows7 64位,但PHP_INT_MAX產生2147483647.有什麼辦法可以設置PHP使用64位?我在這檯筆記本電腦上運行XAMPP服務器,並且我必須對數字進行一些轉換,如果數字轉移太多,我會得到不正確的答案。

在此先感謝。 傑克

回答

1

From the reference

的整數的大小是依賴於平臺的,雖然約兩十億的最大值是通常的值(這是32位帶符號的)。 64位平臺的最大值通常約爲9E18。 PHP不支持無符號整數。整數大小可以使用常量PHP_INT_SIZE確定,最大值使用自PHP 4.4.0和PHP 5.0.5以來的常量PHP_INT_MAX。

所以不,你不能將它設置爲使用64位。

看起來好像GMP functions可能是你需要的。有人發佈了一個尖上this page做按位與他們轉移:

此外,對於那些誰願意做按位轉移,這是相當簡單的。要左移,只是POW(2乘以數字x ),並右移,除以pow(2,x)。

<?php 
function gmp_shiftl($x,$n) { // shift left 
    return(gmp_mul($x,gmp_pow(2,$n))); 
} 

function gmp_shiftr($x,$n) { // shift right 
    return(gmp_div($x,gmp_pow(2,$n))); 
} 
?> 
+0

你打我吧。我打算說同樣的事情,代之以展示[bcmath](http://php.net/manual/en/book.bc.php)代碼示例。 – PleaseStand

+0

我不知道這將如何幫助我?如果我限於32位,我打電話: $ bitString = $ bitString << 5; 其中$ bitString是10183165152我幾乎卡住了?我在你的建議中遺漏了什麼? –

+0

你會使用GMP數字,這是任意的精度,而不是PHP的固定大小整數。您可以使用[GMP init](http://php.net/manual/en/function.gmp-init.php)創建GMP編號。另外,正如@PleaseStand建議的那樣,你也可以使用bcmath來完成同樣的事情,因爲它也提供了任意的精確數學。 –

0
function logical_right_shift($val , $shft) { 
    return floor(($val/pow(2,$shft))); 
} 

function logical_left_shift($val , $shft) { 
    return ($val * pow(2,$shft)); 
}