8

わかりました。PHP は、32 ビットの符号付き整数のみをネイティブにサポートしていることを考えると、任意の大きな整数を扱うのに最適な言語ではありません。私がやろうとしているのは、任意に大きな 2 進数を表すことができ、そのうちの 2 つで単純な算術演算 (加算/減算/乗算/除算) を実行できるクラスを作成することです。

私のターゲットは 128 ビット整数を扱っています。

私が検討しているいくつかのアプローチと、それらに見られる問題があります。何を選択し、どのようにそれを実行するかについての意見やコメントをいただければ幸いです。

アプローチ #1:整数を 4 つの 32 ビット整数として内部に格納する 128 ビット整数クラスを作成します。このアプローチの唯一の問題は、2 つのオペランドの個々のチャンクを操作するときにオーバーフロー/アンダーフローの問題を処理する方法がわからないことです。

アプローチ #2: bcmath 拡張機能を使用します。これは、対処するように設計されているように見えるためです。このアプローチを採用する際の唯一の懸念は、bcmath 拡張機能のスケール設定です。これは、128 ビット整数に丸め誤差が発生する可能性がないためです。それらは正確でなければなりません。また、最終的に bcmath 関数の結果をバイナリ文字列に変換できるかどうかも心配しています (これは、後でいくつかの mcrypt 暗号化関数に押し込む必要があります)。

アプローチ #3:数値をバイナリ文字列として格納します (おそらく LSB が最初)。理論的には、この方法で任意のサイズの整数を格納できるはずです。2 つのバイナリ文字列に対して add/sub/mult/div を実行し、バイナリ文字列の結果を生成する 4 つの基本的な算術関数を記述するだけです。これはまさに私が mcrypt に引き渡す必要があるフォーマットであるため、追加のプラスです。これは、現時点で最も見込みがあると私が考えるアプローチですが、私が持っている唯一の問題点は、PHP が (私が知っている) 個々のビットを操作する方法を提供しないことです。私はそれをバイトサイズのチャンクに分割する必要があると思います(しゃれは意図していません)。その時点で、アプローチ#1のオーバーフロー/アンダーフローの処理に関する私の質問が適用されます。

4

4 に答える 4

4

これには、 PHPGMP拡張機能の方が適しています。追加のボーナスとして、次のように、10進数から2進数への変換を行うために使用できます。

gmp_strval(gmp_init($n, 10), 2);
于 2009-09-04T22:46:54.650 に答える
3

これにはすでにさまざまなクラスが 用意されているので、独自のソリューションを作成する前にそれらを確認することをお勧めします(実際に独自のソリューションを作成する必要がある場合)。

于 2008-09-01T03:37:26.117 に答える
1

私が知る限り、bcmath拡張機能が必要です。PHPマニュアルのデータは少しまばらですが、bcscale()関数、または他のほとんどのbcmath関数のオプションの3番目のパラメーターを使用して、必要な精度に正確に設定できるようになっています。バイナリ文字列についてはよくわかりませんが、少しグーグルすると、pack()関数を使用して実行できるはずです。

于 2008-09-01T03:54:19.617 に答える