2013-01-03 71 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)); 
}