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);
我在 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);