1

我需要在 java 中表示 128 位 int 键,比如

0x9c1f03a0d9cf510f2765bd0f226ff5dc

我知道理论上如何表示 128 位变量.. 切成 2 个 64 位 int 或 4 个 32 位 int。

但是我需要这种表示来比较键(k1 < k2 和 k1 == k2),我不知道如何将键拆分为多个 int,我也不知道如何将我的六键拆分为 2 或 4 个 int。

我对位操作和转换完全一无所知,一些解释会非常有用

4

3 回答 3

1

好消息!Java 提供了任意精度的整数类型。构造BigInteger(String, int)函数可用于获取十六进制并生成 128 位值。进一步BigIntegerComparable。你可以像这样使用它,

BigInteger bi = new BigInteger("9c1f03a0d9cf510f2765bd0f226ff5dc", 16);
BigInteger bi2 = bi.add(BigInteger.ONE);
if (bi2.compareTo(bi) > 0) {
    System.out.println("Like this");
}

输出

Like this
于 2018-10-27T14:54:04.643 回答
1

使用Long.compareUnsigned(以及其他将longs 视为无符号的方法),位技巧不再重要。您可以只实现标准的多元素比较,首先处理更重要的值。

但是,您应该long优先使用 s 而不是ints,因为这将显着减少 64 位 CPU 完成的工作,而与 32 位 CPU 没有太大区别。


对于小端序中的 s compareTolong[]

public static int keyCompareTo(final long[] a, final long[] b) {
    final int highComp = Long.compareUnsigned(a[1], b[1]);
    if (highComp != 0) return highComp;
    else return Long.compareUnsigned(a[0], b[0]);
}

或者,使用一个对象:

public class Key implements Comparable<Key> {
    final protected long high;
    final protected long low;

    public int compareTo(final Key other) {
        if (other == null) throw new NullPointerException();
        final int highComp = Long.compareUnsigned(a.high, b.high);
        if (highComp != 0) return highComp;
        else return Long.compareUnsigned(a.low, b.low);
    }
}

对于平等:

a[0] == b[0] && a[1] == b[1]
a.high == b.high && a.low == b.low

对于小于:

final int highComp = Long.compareUnsigned(a[1], b[1]);
final boolean lessThan = highComp < 0 || (highComp == 0 && Long.compareUnsigned(a[0], b[0]) < 0);
final int highComp = Long.compareUnsigned(a.high, b.high);
final boolean lessThan = highComp < 0 || (highComp == 0 && Long.compareUnsigned(a.low, b.low) < 0);
于 2018-10-27T15:13:56.003 回答
0

您可以使用BigInteger

String hexString = "9c1f03a0d9cf510f2765bd0f226ff5dc";
BigInteger bigInt = new BigInteger(hexString, 16);
System.out.println(bigInt);
于 2018-10-27T14:53:53.490 回答