4

符号なし整数の 32 ビット除算を実行する必要があるインタープリターを作成しました。Java では、次のように実行できます。

reg[a] = (int) ((reg[b] & 0xFFFFFFFFL) / (reg[c] & 0xFFFFFFFFL));

しかし、long への変換と int への変換は避けたいと思います。Java は、その特殊なケースに対して符号なし右シフト演算子を既に提供している>>>ため、同じ方法で符号なし除算を行う賢い方法があるかもしれません。

2 の補数が機能するため、加算と乗算は正常に機能することに注意してください。

Javaでこれを行うためのより良い方法はありますか?

4

3 に答える 3

1

Java 8 以降では、署名されていないsIntegerに対する操作のコレクション全体がありますint

reg[a] = Integer.divideUnsigned(reg[b], reg[c]);
于 2021-01-02T05:18:41.217 に答える
1

1 ビット下にシフトすると、結果の 2 つの数値を除算してから、2 回シフトアップすることができます (結果の数値は 4 分の 1 になるため)。ただし、最下位ビットが失われるため、これは偶数でのみ機能します。

その状態をチェックする時間を節約できるとは本当に思いません。(または 2 31より小さい数値をチェックします)

于 2009-12-19T04:18:38.913 に答える
-1

任意のサイズの整数で機能する をいつでも使用できますが、 に昇格して としてキャストバックBigIntegerするよりもはるかにコストがかかります。あなたの意図はパフォーマンスを改善することですか (したがって、キャストの時間を避けるために「純粋な整数」ソリューションが必要です)、またはコードの読みやすさ/理解可能性を改善すること (この場合、BigInteger の方が優れている可能性があります) ですか?longint

于 2009-12-19T04:24:08.797 に答える