从64位数转换为32位数

时间:2012-07-27 16:17:27

标签: php 32bit-64bit

尝试了很多而且失败了..

$x = 76561198005785475;

我想要这个号码,转到这个:

$y = 45519747;

这是它的32位形式。


尝试解释更多细节:

http://www.tonymarston.net/php-mysql/converter.php

1)将值76561198005785475放在“十进制(输入)”字段中。 2)在“二进制(Base 2)”字段中按“DEC to BIN”。 3)从右边开始计数32并复制它。 4)在“Binary(Base 2)”字段上粘贴32个字符的二进制数。 5)按“Binary(Base 2)”字段中的“Bin to Dec”按钮。

好的,现在您可以看到“45519747”号码。

4 个答案:

答案 0 :(得分:14)

试试这个:

$y = $x & 0xffffffff;

这会将您的64位值截断为32位值,但请注意,绝对无法恢复64位值,这是一种破坏性方法。

答案 1 :(得分:2)

我尝试了很多解决方案。但没有人帮助我。最后,遵循脚本拯救我的生命。

function intval32bits($value)
{
    $value = ($value & 0xFFFFFFFF);

    if ($value & 0x80000000)
        $value = -((~$value & 0xFFFFFFFF) + 1);

    return $value;
}

答案 2 :(得分:1)

写入评论的时间太长,所以我会在这里发布。

@Kolink有正确的答案;你想要的是那个操作。但请注意,由于您的$x太大而无法以int格式存储,因此它将在32位计算机中保留为float,{{1}遭受精确损失。我的宠物理论为什么你得到45519744而不是正确的答案是你的32位计算机丢失了最后数字的精度。要查看此操作,请尝试以下here

float

该站点使用32位服务器,并返回45519744.这表明精度损失。

另一方面,如果你去here并运行:

$x = 76561198005785475;
echo (int)$x;

您得到正确答案,因为该网站是64位。

如果你想在32位机器上进行操作(你显然这样做),我建议你使用PHP GMP扩展中的gmp_and。不幸的是,我无法测试它是否有效 - 我会把它留给你。

答案 3 :(得分:0)

我有类似的东西。从 Int64 转换为 Int32 时,我想考虑溢出。这段代码很适合我:

function intval32bits($value)
{
    $value = ($value & 0xFFFFFFFF);

    if ($value & 0x80000000)
        $value = -((~$value & 0xFFFFFFFF) + 1);

    return $value;
}