Python 位移 vs PHP 位移

Python bitshifting vs PHP bitshifting

我在 python 中有一个代码,它使用右位移位,它 returns 是正确的值,但与我在 PHP 中尝试右移的方式相同,它 returns 0.

Python代码:

print((1640628245535850*0x20c49ba5e353f7cf) >> 64)
// returns 210000415428588

PHP代码:

$x8 = (1640628245535850*0x20c49ba5e353f7cf);
$x8 = number_format($x8, 0, '', '');
echo $x8 >> 64;
// returns 0

我对数学函数的经验很少,如果有人能提供帮助就太好了。

当 运行 版本 8.1.1 中的 PHP 代码(启用警告)时,我收到此警告:

Deprecated: Implicit conversion from float-string "3873823918783864565866509837008896" to int loses precision

这就解释了。与 Python 不同,PHP 的整数不是大整数,因此当它们不适合 word(平台相关)时,它们表示为浮点数(像这里)。这意味着精度丢失,并且您获得的位移输出与 Python 脚本中的数字不同。

如果您想在 PHP 中支持大整数,您可以查看扩展,例如 GMP

此运算符 >> 正在处理整数值,因此运算符的左侧将转换为整数。

根据手册,整数的最大值约为9E18。 https://www.php.net/manual/en/language.types.integer.php

而第一部分计算(1640628245535850*0x20c49ba5e353f7cf)大约是4E33。所以很明显PHP不能在整数模式下做这个计算。幸运的是,PHP 自动在 Floating Point 模式下进行计算。

但问题从使用 >> 的地方开始。 PHP 尝试将 ~4E33 转换为整数并且会发生溢出。

解决方案正在Floating Point中进行计算。在数学中,向右移动 1 位等于除以 2。所以这段代码 return 真值:

echo 1640628245535850 * 0x20c49ba5e353f7cf / pow(2,64);