2010-03-17 41 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