web-dev-qa-db-ja.com

Java

現在、私は-2 ^ 63から2 ^ 63-1までの符号付き値を使用しています。同じ範囲(2 * 2 ^ 64)が必要ですが、正の値のみが必要です。私はJavaの署名なしのロングに関するドキュメントを見つけました。これはこの用途に適しています。

2 ^ 64をLongラッパーオブジェクトに宣言しようとしましたが、それでもデータが失われます。つまり、Long.MAX_VALUEまでしかキャプチャされないので、明らかに何かが不足しています。 BigIntegerは、Javaがサポートする署名されたlongですか?

それを宣言して使用する方法に関する定義またはポインタはありますか?

14
Annapoorni D

Java 8、でunsigned longサポートが導入されました。これらは典型的なlongですが、符号は加算と減算に影響しません。除算と比較のために、 Long。また、次のことができます。

long l1 = Long.parseUnsignedLong("12345678901234567890");
String l1Str = Long.toUnsignedString(l1)

BigIntegerは少し異なります。それは膨大な数を保つことができます。それらをint[]として保存し、算術をサポートします。

12
xenteros

Javaにはunsigned long型はありませんが、注意して、符号付き64ビット2の補数の整数(つまり、long)を符号なしとして扱うことができます。

多くのプリミティブ整数演算は「符号にとらわれない」ものです。例えばJavaプリミティブな加算、減算、乗算を使用し、longを使用して表される符号なしの数値に対して「正しい」答えを得ることができます。

除算や比較などの他の演算については、LongクラスがdivideUnsignedcompareUnsignedのようなメソッドを提供し、longとして表される符号なし数値の正しい結果を提供します値。

署名されていない操作をサポートするこれらのメソッドは、Java 8に追加されました。それ以前は、Guavaなどのサードパーティライブラリを使用できました。たとえば、静的メソッド com.google.common.primitives.UnsignedLongs 。)

11
Stephen C

サードパーティのライブラリを使用するオプションがある場合は、Javaで符号なし整数のラッパー型を提供する jOOjOOQ からのスピンオフライブラリ)があります。これは、プリミティブ型(つまり、バイトコード)をサポートする符号なしの型をサポートすることとまったく同じではありませんが、おそらくユースケースには十分です。

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の値に合わせてクールなビットシフトが行われます。

(免責事項:私はこれらのライブラリの背後にある会社で働いています)

0
Lukas Eder