[英]how convert float to 64bit binary or 32bit float to 64bit int - php
[英]Convert from 64bit number to 32bit number
尝试了很多,只是失败了..
$x = 76561198005785475;
我要这个号,变成这个:
$y = 45519747;
那是它的 32 位形式。
试图解释更多细节:
http://www.tonymarston.net/php-mysql/converter.php
1) 将值 76561198005785475 放在“十进制(输入)”字段中。 2) 在“Binary (Base 2)”字段上按“DEC to BIN”。 3) 从右边开始数 32 并复制它。 4) 将 32 个字符的二进制数粘贴到“Binary (Base 2)”字段上。 5) 在“Binary (Base 2)”字段上按“Bin to Dec”按钮。
好的,现在您可以看到“45519747”号码。
尝试这个:
$y = $x & 0xffffffff;
这会将您的 64 位值截断为 32 位值,但请注意,绝对无法恢复 64 位值,这是一种破坏性方法。
我尝试了很多解决方案。 但是没有人帮我。 最后,以下脚本挽救了我的生命。
function intval32bits($value)
{
$value = ($value & 0xFFFFFFFF);
if ($value & 0x80000000)
$value = -((~$value & 0xFFFFFFFF) + 1);
return $value;
}
写到评论里太长了,所以我把它贴在这里。
@Kolink 有正确的答案; 你想要的是那个操作。 但是,请注意,由于您的$x
太大而无法以int
格式存储,因此它将在 32 位计算机中作为float
保存,并且float
s 会遭受精度损失。 我关于为什么得到 45519744 而不是正确答案的宠物理论是,您的 32 位计算机失去了最后一位数字的精度。 要查看此操作,请在此处尝试:
$x = 76561198005785475;
echo (int)$x;
该站点使用 32 位服务器,返回 45519744。这说明了精度损失。
另一方面,如果你去这里运行:
$x = 76561198005785475;
$y = $x & 0xffffff;
您会得到正确的答案,因为该站点是 64 位的。
如果您想在 32 位机器上执行操作(正如您显然所做的那样),我建议您使用 PHP GMP 扩展中的gmp_and 。 不幸的是,我无法测试它是否有效 - 我会把它留给你。
我有类似的事情。 从 Int64 转换为 Int32 时,我想考虑溢出。 这段代码对我来说效果很好:
function intval32bits($value)
{
$value = ($value & 0xFFFFFFFF);
if ($value & 0x80000000)
$value = -((~$value & 0xFFFFFFFF) + 1);
return $value;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.