2013-04-17 73 views
1

我在这里有点难住。我有2个32位整数,其中一个用于最重要的位&另一个是最小的。如何在PHP中找到这两个十进制数的等价物?从PHP中最高有效位和最低有效位计算小数

更新: 我试图从@bwoebi的建议和修改了一些。下面的代码:

$value=get64($msb, $lsb); 

function get64($msb, $lsb) { 
    $count = count($lsb); 
    for($i=0; $i < $count; $i++) { 
     $value[$i] = bcadd(bcmul($msb[$i], bcpow(2, 32)), $lsb[$i] > 0?$lsb[$i]:bcadd(bcsub(bcpow(2, 32), $lsb[$i]), 2 << 30)); // $a most significant bits, $b least significant bits 
    } 
} 

输出:

msb=Array ([0] => INTEGER: 0 [1] => INTEGER: 0) 
lsb=Array ([0] => INTEGER: 143 [1] => INTEGER: 0) 
value=Array ([0] => 2147483648 [1] => 2147483648) 

输出不看的权利......我本来预计143 [0]值。任何输入?

+0

所以我猜你正在运行32位PHP;如果您运行64位PHP,这可能会更容易;虽然他们是有符号还是无符号整数? –

+0

@MarkBaker PHP只有有符号整数... – bwoebi

+0

@bwoebi - 我知道,这就是为什么它有所作为,如果OP的整数是无符号的 –

回答

1
bcadd(bcmul($a, bcpow(2, 32)), $b >= 0?$b:bcsub(bcpow(2, 32), $b)); // $a most significant bits, $b least significant bits 

应该做的工作。我正在使用bc库,因为在使用32位系统上的普通操作符时可能存在不精确性(它将转换为浮点数)。

+0

我试过你的代码,这些值:'a = 1 b = 2147483647 sum = 6442450943'这是否正确? – PLui

+0

@PLui它是正确的... 1 * 2^32 + 2^31 - 1 = 3 * 2^31 - 1 = 6442450943(ps它也将负数$ b转换为无符号值:b = -2147483648(和$ a = 0)=> 2^32) – bwoebi

+0

非常感谢您的帮助! – PLui