Лучший способ преобразовать целое число со знаком в длинную без знака? - PullRequest
48 голосов
/ 06 марта 2012

Для некоторых хеш-функций в Java было бы неплохо видеть значение как целое число без знака (например, для сравнения с другими реализациями), но Java поддерживает только подписанные типы. Мы можем преобразовать int со знаком в "* без знака" long следующим образом:

public static final int BITS_PER_BYTE = 8;
public static long getUnsignedInt(int x) {
  ByteBuffer buf = ByteBuffer.allocate(Long.SIZE / BITS_PER_BYTE);
  buf.putInt(Integer.SIZE / BITS_PER_BYTE, x);
  return buf.getLong(0);
}
getUnsignedInt(-1); // => 4294967295

Однако это решение кажется излишним для того, что мы действительно делаем. Есть ли более эффективный способ добиться того же?

Ответы [ 7 ]

86 голосов
/ 06 марта 2012

Как-то так?

int x = -1;
long y = x & 0x00000000ffffffffL;

Или я что-то упустил?

public static long getUnsignedInt(int x) {
    return x & 0x00000000ffffffffL;
}
32 голосов
/ 30 июня 2015

Стандартным способом в Java 8 является Integer.toUnsignedLong(someInt), что эквивалентно @ ответу Mysticial .

17 голосов
/ 06 марта 2012

Гуава предоставляет UnsignedInts.toLong(int) ..., а также множество других утилит для целых чисел без знака.

7 голосов
/ 06 марта 2012

Вы можете использовать такую ​​функцию, как

public static long getUnsignedInt(int x) {
    return x & (-1L >>> 32);
}

однако в большинстве случаев вам не нужно этого делать. Вместо этого вы можете использовать обходные пути. например,

public static boolean unsignedEquals(int a, int b) {
    return a == b;
}

Дополнительные примеры обходных путей для использования беззнаковых значений. Утилита без знака

2 голосов
/ 06 марта 2012

другое решение.

public static long getUnsignedInt(int x) {
    if(x > 0) return x;
    long res = (long)(Math.pow(2, 32)) + x;
    return res;
}
0 голосов
/ 05 марта 2015

Просто мои 2 цента здесь, но я думаю, что это хорошая практика:

public static long getUnsignedInt(int x) { return x & (~0L); // ~ has precedence over & so no real need for brackets }

вместо:

return x & 0xFFFFFFFFL;

В этой ситуации вас не беспокоит, сколько у F маски.Это всегда должно работать!

0 голосов
/ 19 ноября 2014
long abs(int num){
    return num < 0 ? num * -1 : num;
}
...