我需要在 java 中表示 128 位 int 键,比如
0x9c1f03a0d9cf510f2765bd0f226ff5dc
我知道理论上如何表示 128 位变量.. 切成 2 个 64 位 int 或 4 个 32 位 int。
但是我需要这种表示来比较键(k1 < k2 和 k1 == k2),我不知道如何将键拆分为多个 int,我也不知道如何将我的六键拆分为 2 或 4 个 int。
我对位操作和转换完全一无所知,一些解释会非常有用
我需要在 java 中表示 128 位 int 键,比如
0x9c1f03a0d9cf510f2765bd0f226ff5dc
我知道理论上如何表示 128 位变量.. 切成 2 个 64 位 int 或 4 个 32 位 int。
但是我需要这种表示来比较键(k1 < k2 和 k1 == k2),我不知道如何将键拆分为多个 int,我也不知道如何将我的六键拆分为 2 或 4 个 int。
我对位操作和转换完全一无所知,一些解释会非常有用
好消息!Java 提供了任意精度的整数类型。构造BigInteger(String, int)
函数可用于获取十六进制并生成 128 位值。进一步BigInteger
是Comparable
。你可以像这样使用它,
BigInteger bi = new BigInteger("9c1f03a0d9cf510f2765bd0f226ff5dc", 16);
BigInteger bi2 = bi.add(BigInteger.ONE);
if (bi2.compareTo(bi) > 0) {
System.out.println("Like this");
}
输出
Like this
使用Long.compareUnsigned
(以及其他将long
s 视为无符号的方法),位技巧不再重要。您可以只实现标准的多元素比较,首先处理更重要的值。
但是,您应该long
优先使用 s 而不是int
s,因为这将显着减少 64 位 CPU 完成的工作,而与 32 位 CPU 没有太大区别。
对于小端序中的 s compareTo
:long[]
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);
您可以使用BigInteger。
String hexString = "9c1f03a0d9cf510f2765bd0f226ff5dc";
BigInteger bigInt = new BigInteger(hexString, 16);
System.out.println(bigInt);