符号なしでJavaを読み、その値をBigIntegerに格納する方法を教えてください。

どういうわけか私はJavaで8バイトの符号なし整数型を扱わなければなりません。

私の8バイトの符号なし整数は、ByteBufferでラップされたバイト配列に格納されています。それはデータロガーデータベースから来て、そして非常に大きな数を含みます。

これが、4バイト整数を符号なしとして読み取るための方法です。

((long) (bytebuffer.getInt() & 0xFFFFFFFFL));

残念ながらこれ:

((BigInteger) (bytebuffer.getLong() & 0xFFFFFFFFFFFFFFFFL));

うまくいきません。

番号を 2 ^ 64-1 に保存して 2 ^ 64-1 と読み上げるにはどうすればよいですか。

10
ru de
質問自体に対する答えではありませんが、 BigInteger(int型のsignum、byte []の大きさ、int型のオフ値、int型のlen) は、まず始めから便利です。 byte 配列
追加された 著者 Radiodef,
質問自体に対する答えではありませんが、 BigInteger(int型のsignum、byte []の大きさ、int型のオフ値、int型のlen) は、まず始めから便利です。 byte 配列
追加された 著者 Radiodef,
質問自体に対する答えではありませんが、 BigInteger(int型のsignum、byte []の大きさ、int型のオフ値、int型のlen) は、まず始めから便利です。 byte 配列
追加された 著者 Radiodef,

4 答え

Javaの符号付きの long では、最も重要なビットは - (2 63 )です。もしそれが符号なしであれば、そのときそのビットは正の2 63の価値があるだろう。その差は2 64である。

First, create a BigInteger using the long value. Then, if it's negative, apply the unsigned correction by adding 264, or 1 << 64, to the BigInteger.

BigInteger result = BigInteger.valueOf(bytebuffer.getLong());
if (result.compareTo(BigInteger.ZERO) < 0) {
    result = result.add(BigInteger.ONE.shiftLeft(64));
}
12
追加された

これを符号なしの文字列に変換してから、 BigInteger に解析できます。

new BigInteger(Long.toUnsignedString(bytebuffer.getLong()))

おそらく最も効率的な解決策ではありませんが、おそらく最も簡単なものです。

あるいは、この実装を Long クラスから借用することもできます。

static BigInteger toUnsignedBigInteger(long i) {
    if (i >= 0L)
        return BigInteger.valueOf(i);
    else {
        int upper = (int) (i >>> 32);
        int lower = (int) i;

       //return (upper << 32) + lower
        return (BigInteger.valueOf(Integer.toUnsignedLong(upper))).shiftLeft(32).
            add(BigInteger.valueOf(Integer.toUnsignedLong(lower)));
    }
}
5
追加された

これを符号なしの文字列に変換してから、 BigInteger に解析できます。

new BigInteger(Long.toUnsignedString(bytebuffer.getLong()))

おそらく最も効率的な解決策ではありませんが、おそらく最も簡単なものです。

あるいは、この実装を Long クラスから借用することもできます。

static BigInteger toUnsignedBigInteger(long i) {
    if (i >= 0L)
        return BigInteger.valueOf(i);
    else {
        int upper = (int) (i >>> 32);
        int lower = (int) i;

       //return (upper << 32) + lower
        return (BigInteger.valueOf(Integer.toUnsignedLong(upper))).shiftLeft(32).
            add(BigInteger.valueOf(Integer.toUnsignedLong(lower)));
    }
}
5
追加された

これを符号なしの文字列に変換してから、 BigInteger に解析できます。

new BigInteger(Long.toUnsignedString(bytebuffer.getLong()))

おそらく最も効率的な解決策ではありませんが、おそらく最も簡単なものです。

あるいは、この実装を Long クラスから借用することもできます。

static BigInteger toUnsignedBigInteger(long i) {
    if (i >= 0L)
        return BigInteger.valueOf(i);
    else {
        int upper = (int) (i >>> 32);
        int lower = (int) i;

       //return (upper << 32) + lower
        return (BigInteger.valueOf(Integer.toUnsignedLong(upper))).shiftLeft(32).
            add(BigInteger.valueOf(Integer.toUnsignedLong(lower)));
    }
}
5
追加された