1

私はここで少し困惑しています。2 つの 32 ビット整数があります。1 つは最上位ビット用で、もう 1 つは最小です。PHPでこれら2つから10進数に相当するものを見つけるにはどうすればよいですか?

更新: @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 ) 

出力が正しくありません...値 [0] として 143 を期待していました。入力はありますか?

4

2 に答える 2

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

仕事をするべきです。32ビットシステムで通常の演算子を使用すると不正確になる可能性があるため、bcライブラリを使用しています(floatに変換されます)。

于 2013-04-17T20:53:18.370 に答える
0

BC MathまたはGNU Multiple Precision拡張機能を使用して、ネイティブ PHP 変数には大きすぎる値で演算を実行できます。

于 2013-04-17T20:52:47.727 に答える