dsa4214
2012-07-27 16:17 阅读 191
已采纳

从64位数转换为32位数

Trying a lot and just failing..

$x = 76561198005785475;

I want to this number, turn into this:

$y = 45519747;

That is the 32bit form of it.


Trying to explain with more details:

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

1) Put the value 76561198005785475 on the "Decimal (input)" field. 2) Press "DEC to BIN" on the "Binary (Base 2)" field. 3) Count 32 starting from the RIGHT and copy it. 4) Paste the 32 chars binary number on "Binary (Base 2)" field. 5) Press "Bin to Dec" button on the "Binary (Base 2)" field.

Ok, now you can see the "45519747" number.

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

3条回答 默认 最新

  • 已采纳
    dongya1228 dongya1228 2012-07-27 16:22

    Try this:

    $y = $x & 0xffffffff;
    

    This will truncate your 64-bit value to a 32-bit value, but note that there is absolutely no way to get the 64-bit value back, this is a destructive method.

    点赞 评论 复制链接分享
  • dql7588 dql7588 2012-07-27 17:15

    This is too long to write into a comment, so I'll post it here instead.

    @Kolink has the right answer; what you want is that operation. However, note that because your $x is too big to be stored in an int format anyway, it'll be held as a float in 32-bit computers, and floats suffer from precision loss. My pet theory on why you get 45519744 instead of the right answer is that your 32-bit computer lost the precision on the last digits. To see this in action, try this here:

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

    That site uses a 32-bit server, and it returns 45519744. This demonstrates the precision loss.

    On the other hand, if you go here and run:

    $x = 76561198005785475;
    $y = $x & 0xffffff;
    

    You get the right answer, because that site is 64-bit.

    If you want to do the operation on a 32-bit machine (as you evidently do), I suggest you use gmp_and from the PHP GMP extension. Unfortunately I couldn't test to see if it works - I'll leave that to you.

    点赞 评论 复制链接分享
  • duan5801 duan5801 2017-04-04 06:49

    I tried many solution. But no one help me. Finally, following script save my life.

    function intval32bits($value)
    {
        $value = ($value & 0xFFFFFFFF);
    
        if ($value & 0x80000000)
            $value = -((~$value & 0xFFFFFFFF) + 1);
    
        return $value;
    }
    
    点赞 评论 复制链接分享

相关推荐