将有符号整数转换为无符号长整数的最佳方法是什么?
对于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; }