2009-04-20 15 views
10

正確な容量が0〜2^64-1のデータ型を1つ探しています。Javaはそのまま 'unsigned' barring charデータ型をサポートしていません。BigIntegerクラスを使用してJavaで符号なし64ビット整数を実装する方法は?

長いデータ型ではサポートできない大きな数値を作成できるBigIntegerクラスがあります。しかし、私はBigIntegerクラスが私の目的にどのように役立つかわかりません。 BigIntegerクラスは、コンストラクタによる割り当てのみを可能にします。私は以下の可能性を見ていますが、乱数を生成します。

BigInteger(int numBits, Random rnd) 
Constructs a randomly generated BigInteger, uniformly distributed over the range 0 to (2^numBits - 1), inclusive. 

私はこのBigIntegerに自分自身の値を選ぶことができる任意のsetValue(x)種類のAPIを見ることができません。 BigIntegerクラスを使ってこれを実装するにはどうすればいいですか?コードサンプルを投稿してください。

PS:hereさんの質問には実装の詳細がありません。

+1

なぜデータ型が必要なのか、それに何をしようとしているのかを明確にしてください。問題を単純化する方法があるかもしれません... – Alnitak

+0

C++はそのようなデータ型をサポートしています。私はC++とやりとりしており、データを操作してC++で変換するのではなく、Javaエンドでも同様のデータ型を持つ方がよいと考えました。 –

答えて

1

BigIntegerは、あなたが見つけたのと同じように不変です。 BigIntegerをサブクラス化し、入力を検証する独自のコンストラクタを記述し、関連する範囲で正のBigIntegerを生成することができます。

数字が64ビットのみを使用するという要件を維持するには、さまざまな操作をオーバーロードする必要があるため、結果を制限し、新しいBigIntegerではなく新しいクラスのインスタンスを返します。

これはおそらくかなりうまくいくかもしれませんが、最初からすべてを行うよりはるかに優れているはずです。

1

BigIntegerは、longからBigInteger.valueOf(l)を使用して作成できます。lはlongです。

しかし、正確な64ビットで作業したい場合、私はちょうど長い使用したいと思います。

3

独自のラッパーを記述するのは避け、署名されたロングを使用してください。ユーザーが符号なしの値をBigIntegerとしてフェッチしたい場合 - 符号をテストし、2^64をBigIntegerに追加します。

2

BigIntegerをカプセル化するUInt64クラスを作成することができます。すべての操作(add、mulなど)が符号なし64ビットBigIntegerを返すことも確認できます。

class UInt64 { 

    private final BigInteger value; 

    private UInt64(BigInteger aValue) { 
     // method to enforce your class invariant: 0...2**64-1 
     checkInvariantOf(aValue); 
     value = aValue; 
    } 

    public static UInt64 of(String value) { 
     return new UInt64(new BigInteger(value)); 
    } 

    public UInt64 add(UInt64 v) { 
     return new UInt64(value.add(v.value)); 
    } 

    .... 
} 
7

彼らは符号なしであるかのようにあなたは、多くの場合、Javaの符号付き数値データ型を使用することができるかもしれないトリッキーなオーバーフローをシミュレートします。

これを参照してくださいold answer Javaの署名付きと署名なしについて

1

値0〜2^64-1を長い値で格納できます。

多くの操作は期待どおりに機能しますが、ほとんどのAPIと操作の一部は、署名付き操作を前提としていますが、回避策があります。

BigIntegerを使用すると簡単に頭を上げることができます。 ;)

+0

longは-2^63〜(2^63)-1をサポートします。最初のビットは符号ビットです。私は0から(2^64)-1までの範囲になる符号なしlongを必要とします。 私は2 ^(64-1)ではありません。それは(2^64)-1です。 –

+2

私はこの区別があなた次第であると信じています。 +、 - 、^、&、|、<<, > >>〜を使用すると、結果を見分けることができません。 Long.toHexString(long)を呼び出すと、負の数値が出力されません。 –

+1

また、==と!=;) –

1

Java SE 8以降では、long型のデータ型を使用して、符号なし64ビットlongを表すことができます。最小値は0、最大値は2^64-1です。

+1

この回答にコード例を追加したり、いくつかのドキュメントへのリンクを追加すると非常に役に立ちます。 – CubeJockey

+0

http://docs.oracle.com/javase/8/docs/api/java/lang/Long.html - 新しい機能に注目してください... compareUnsignedなど...これはPeter Lawreyは彼の答えとコメントで言っていた。 –

関連する問題