現在、私は-2 ^ 63から2 ^ 63-1までの符号付き値を使用しています。同じ範囲(2 * 2 ^ 64)が必要ですが、正の値のみが必要です。私はJavaの署名なしのロングに関するドキュメントを見つけました。これはこの用途に適しています。
2 ^ 64をLongラッパーオブジェクトに宣言しようとしましたが、それでもデータが失われます。つまり、Long.MAX_VALUE
までしかキャプチャされないので、明らかに何かが不足しています。 BigInteger
は、Javaがサポートする署名されたlongですか?
それを宣言して使用する方法に関する定義またはポインタはありますか?
Java 8、でunsigned long
サポートが導入されました。これらは典型的なlongですが、符号は加算と減算に影響しません。除算と比較のために、 Long
。また、次のことができます。
long l1 = Long.parseUnsignedLong("12345678901234567890");
String l1Str = Long.toUnsignedString(l1)
BigInteger
は少し異なります。それは膨大な数を保つことができます。それらをint[]
として保存し、算術をサポートします。
Javaにはunsigned long型はありませんが、注意して、符号付き64ビット2の補数の整数(つまり、long
)を符号なしとして扱うことができます。
多くのプリミティブ整数演算は「符号にとらわれない」ものです。例えばJavaプリミティブな加算、減算、乗算を使用し、long
を使用して表される符号なしの数値に対して「正しい」答えを得ることができます。
除算や比較などの他の演算については、Long
クラスがdivideUnsigned
やcompareUnsigned
のようなメソッドを提供し、long
として表される符号なし数値の正しい結果を提供します値。
署名されていない操作をサポートするこれらのメソッドは、Java 8に追加されました。それ以前は、Guavaなどのサードパーティライブラリを使用できました。たとえば、静的メソッド com.google.common.primitives.UnsignedLongs
。)
サードパーティのライブラリを使用するオプションがある場合は、Javaで符号なし整数のラッパー型を提供する jOO ( jOOQ からのスピンオフライブラリ)があります。これは、プリミティブ型(つまり、バイトコード)をサポートする符号なしの型をサポートすることとまったく同じではありませんが、おそらくユースケースには十分です。
import static org.joou.Unsigned.*;
// and then...
UByte b = ubyte(1);
UShort s = ushort(1);
UInteger i = uint(1);
ULong l = ulong(1);
これらのタイプはすべてJava.lang.Number
およびより高次のプリミティブ型とBigInteger
に変換できます。あなたの場合、以前のバージョンのjOOUは単にunsigned long値をBigInteger
に格納していました。バージョン0.9.3では、通常のlong
の値に合わせてクールなビットシフトが行われます。
(免責事項:私はこれらのライブラリの背後にある会社で働いています)