对于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
然而,这个解决方案对于我们真正做的事情来说似乎有些过分。是否有更有效的方法来实现同样的目标?
答案 0 :(得分:85)
这样的东西?
int x = -1;
long y = x & 0x00000000ffffffffL;
或者我错过了什么?
public static long getUnsignedInt(int x) {
return x & 0x00000000ffffffffL;
}
答案 1 :(得分:29)
Java 8中的标准方式是Integer.toUnsignedLong(someInt)
,相当于@Mysticial's answer。
答案 2 :(得分:16)
Guava提供UnsignedInts.toLong(int)
...以及无符号整数上的各种其他实用程序。
答案 3 :(得分:7)
您可以使用
之类的功能public static long getUnsignedInt(int x) {
return x & (-1L >>> 32);
}
然而,在大多数情况下,您不需要这样做。您可以改用变通方法。 e.g。
public static boolean unsignedEquals(int a, int b) {
return a == b;
}
有关使用无符号值的变通方法的更多示例。 Unsigned utility class
答案 4 :(得分:2)
其他解决方案。
public static long getUnsignedInt(int x) {
if(x > 0) return x;
long res = (long)(Math.pow(2, 32)) + x;
return res;
}
答案 5 :(得分:-2)
这里只需2美分,但我认为这是一个很好的做法:
public static long getUnsignedInt(int x) {
return x & (~0L); // ~ has precedence over & so no real need for brackets
}
而不是:
返回x& 0xFFFFFFFFL;
在这种情况下,你不关心面具有多少个面具。它应该永远有效!
答案 6 :(得分:-4)
long abs(int num){
return num < 0 ? num * -1 : num;
}