128-битное представление и примитивы в Java
Мне нужно представить 128-битный ключ INT в Java, как
0x9c1f03a0d9cf510f2765bd0f226ff5dc
Я знаю, как представить 128-битную переменную в теории... разрезать на 2 64-битных int или четыре 32-битных int
Но мне нужно это представление для ключей сравнения (k1 Я совершенно не осведомлен о битовых манипуляциях и трансформации, некоторые объяснения были бы очень полезны
3 ответа
Фантастические новости! 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
как без знака), битовые трюки больше не нужны. Вы можете просто реализовать стандартное многоэлементное сравнение, где более значимые значения обрабатываются первыми.
Вы должны использовать long
с предпочтением int
Тем не менее, поскольку это значительно сократит работу, выполняемую 64-разрядными ЦП, при этом не сильно отличаясь от 32-разрядных ЦП.
За compareTo
с long[]
s в порядке байтов:
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);