Ответ 1
Что-то вроде этого?
int x = -1;
long y = x & 0x00000000ffffffffL;
Или я что-то не хватает?
public static long getUnsignedInt(int x) {
return x & 0x00000000ffffffffL;
}
Для некоторых хеш-функций в Java было бы хорошо видеть значение как целое без знака (например, для сравнения с другими реализациями), но Java поддерживает только подписанные типы. Мы можем преобразовать подписанный int
в "unsigned" 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
Однако это решение кажется излишним для того, что мы действительно делаем. Есть ли более эффективный способ достичь того же?
Что-то вроде этого?
int x = -1;
long y = x & 0x00000000ffffffffL;
Или я что-то не хватает?
public static long getUnsignedInt(int x) {
return x & 0x00000000ffffffffL;
}
Стандартный способ в Java 8 - Integer.toUnsignedLong(someInt)
, что эквивалентно @Mysticial ответить.
Guava предоставляет UnsignedInts.toLong(int)
... а также множество других утилит на целые числа без знака.
Вы можете использовать функцию типа
public static long getUnsignedInt(int x) {
return x & (-1L >>> 32);
}
однако в большинстве случаев вам не нужно это делать. Вместо этого вы можете использовать обходные пути. например.
public static boolean unsignedEquals(int a, int b) {
return a == b;
}
Дополнительные примеры обходных решений для использования значений без знака. Неподписанный класс утилиты
другое решение.
public static long getUnsignedInt(int x) {
if(x > 0) return x;
long res = (long)(Math.pow(2, 32)) + x;
return res;
}
Только мои 2 цента здесь, но я считаю, что это хорошая практика:
public static long getUnsignedInt(int x) {
return x & (~0L); // ~ has precedence over & so no real need for brackets
}
вместо:
return x и 0xFFFFFFFFL;
В этой ситуации нет вашего беспокойства о том, сколько "F" имеет маска. Он всегда будет работать!
long abs(int num){
return num < 0 ? num * -1 : num;
}