将有符号整数转换为无符号长整数的最佳方法是什么?

对于Java中的某些哈希函数,将该值视为无符号整数(例如,用于与其他实现进行比较)是很好的,但是Java仅支持签名types。 我们可以将一个带符号的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 

然而,这个解决scheme似乎对我们真正在做的事情有点矫枉过正。 有没有更有效的方法来实现同样的事情?

像这样的东西?

 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; } 

有关使用无符号值的解决方法的更多示例。 未签名的实用程序类

其他解决scheme

 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 }

代替:

返回x&0xFFFFFFFFL;

在这种情况下,不用担心有多lessF的面具。 它应该始终工作!

 long abs(int num){ return num < 0 ? num * -1 : num; }