3

私はいくつかの解決策を見つけました32ビット値を使用して64ビットローテーションを行う効率的な方法ですが、PHPではありません。

最大の問題は、リモートサーバーから大きな整数9223372036854775808(10)をとして取得することhexadecimal 8000000000000000(16)です。

本番サーバーで有効にする機会はありませんがphp_gmp (extension)、受信した値の選択したビットを確認する必要があります。本番サーバーと開発サーバーはどちらも32bits machinesです。

4

1 に答える 1

1

これは、BC Math (Arbitrary Precision Mathematics) を使用して実現できます。

BC Math を使用すると、数値に対して数学演算を実行できます。算術演算子を使用する場合と BC Maths を使用する場合の違いは、数値を整数または浮動小数点として格納する代わりに、BC Math が数値を文字列として返すことです。

http://php.net/manual/en/ref.bc.php

PHP は BC Math でコンパイルする必要があります。ただし、ほとんどの PHP インストールにはこれが必要です。

残念ながら、文字列に対してビット単位の演算を行うことはできず、BC Math にはビット単位の関数が組み込まれていません。でも; 少しグーグルを行った後、次のコードサンプルを見つけたので、それをコピーして以下に貼り付けました。

function bitValue($no) { return bcpow(2, $no); }
function bitSet($no, $value) {
    $tmp = bcmod($value, bitValue($no+1));
    return bccomp(bcsub($tmp, bitValue($no)), 0)>= 0;
}

echo bitSet(49, bitValue(48)) ."\n";
echo bitSet(48, bitValue(48)) ."\n";
echo bitSet(47, bitValue(48)) ."\n";

(hernst42へのクレジット)

于 2012-07-06T16:22:59.047 に答える