3

コンポーネントには、後でキーとしてキャッシュに使用する long 値が渡されます。キー自体は、符号なしの 64 ビット値であるかのように、long 値の文字列表現です。つまり、コンポーネントが -2944827264075010823L に渡された場合、それを文字列キー "15501916809634540793" に変換する必要があります。

解決策はありますが、力ずくのようで、少し吐き気がします。基本的に、long を 16 進数の文字列表現に変換し (つまり、-2944827264075010823L は "d721df34a7ec6cf9" になります)、16 進数の文字列を BigInteger に変換します。

String longValueAsHexString = convertLongToHexString(longValue);
BigInteger bi = new BigInteger(longValueAsHexString, 16);
String longValueString = bi.toString();

次に、キャッシュへのキーとして longValueString を使用します。

Long.toString(longValue,16) は使用できません。これは、絶対値の 16 進文字列が返され、接頭辞が "-" になっているためです。

したがって、私の convertLongToHexString は次のようになります。

long mask = 0x00000000ffffffffL;
long bottomHalf = number & mask;
long upperHalf = (number >> 32) & mask;
String bottomHalfString = Long.toString(bottomHalf, 16);
if (bottomHalfString.length() != 8) {
    String zeroes = "0000000000000000";
    bottomHalfString = zeroes.substring(16-bottomHalfString.length()) + bottomHalfString;
}
return Long.toString(upperHalf,16)+bottomHalfString;

これを行うためのよりエレガントな方法が必要です。助言がありますか?

4

4 に答える 4

5

これが私の実装です。long文字列を受け取って返す関数を持つようにリファクタリングしました。:-)

import java.math.BigInteger;

class UInt64Test {
    public static void main(String[] args) {
        for (String arg : args)
            System.out.println(toUnsignedString(Long.parseLong(arg)));
    }

    private static final BigInteger B64 = BigInteger.ZERO.setBit(64);
    public static String toUnsignedString(long num) {
        if (num >= 0)
            return String.valueOf(num);
        return BigInteger.valueOf(num).add(B64).toString();
    }
}
于 2008-10-20T05:21:54.087 に答える
4

クリスの答えの方が良いと思いますが、ここに別の楽しみがあります。

public static String longUnsignedString(long l) {
  byte[] bytes = new byte[9];

  for (int i = 1; i < 9; i++) {
     bytes[i] = (byte) ((l >> ((8 - i) * 8)) & 255);
  }

  return (new BigInteger(bytes)).toString();
}
于 2008-10-20T06:04:32.330 に答える
1

ビットレス実装:

    byte[] bytes = ByteBuffer.allocate(8).putLong(1023L).array();
    System.out.println(new BigInteger(bytes).toString(2));

よろしく、アレックス

于 2011-09-14T13:41:01.193 に答える