128-битное представление и примитивы в Java - PullRequest
0 голосов
/ 27 октября 2018

Мне нужно представить 128-битный ключ int в Java, как

0x9c1f03a0d9cf510f2765bd0f226ff5dc

Я знаю, как представить 128-битную переменную в теории ... разрезать на 2 64-битные int или четыре 32-битных int.

Но мне нужно это представление для ключей сравнения (k1

Я совершенно не осведомлен о манипулировании битами и преобразовании, некоторые объяснения были бы очень полезны

Ответы [ 3 ]

0 голосов
/ 27 октября 2018

Фантастические новости! 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
0 голосов
/ 27 октября 2018

С Long.compareUnsigned (и другими методами, которые обрабатывают long s как беззнаковые), битовые трюки больше не нужны. Вы можете просто реализовать стандартное многоэлементное сравнение, где более значимые значения обрабатываются первыми.

Вы должны использовать long с вместо int с, так как это значительно сократит работу, выполняемую 64-битными ЦП, но не будет иметь большой разницы для 32-битных ЦП.


Для 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);
0 голосов
/ 27 октября 2018

Вы можете использовать BigInteger .

String hexString = "9c1f03a0d9cf510f2765bd0f226ff5dc";
BigInteger bigInt = new BigInteger(hexString, 16);
System.out.println(bigInt);
...