简体   繁体   中英

Convert from 64bit number to 32bit number

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.

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.

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;
}

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 float s 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.

I had something similar. I was want to consider Overflow when converting from Int64 to Int32. this code worked well for me:

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

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

    return $value;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM