Convert from 64bit number to 32bit number

前端 未结 3 1906
我寻月下人不归
我寻月下人不归 2020-12-07 02:46

Trying a lot and just failing..

$x = 76561198005785475;

I want to this number, turn into this:

$y = 45519747;
相关标签:
3条回答
  • 2020-12-07 03:13

    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.

    0 讨论(0)
  • 2020-12-07 03:17

    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;
    }
    
    0 讨论(0)
  • 2020-12-07 03:21

    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.

    0 讨论(0)
提交回复
热议问题