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

mae*_*ics 50 java unsigned

对于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
Run Code Online (Sandbox Code Playgroud)

但是,这个解决方案对我们真正做的事情来说似乎有些过分.有没有更有效的方法来实现同样的事情?

Mys*_*ial 88

像这样的东西?

int x = -1;
long y = x & 0x00000000ffffffffL;
Run Code Online (Sandbox Code Playgroud)

或者我错过了什么?

public static long getUnsignedInt(int x) {
    return x & 0x00000000ffffffffL;
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,使用Murmur Hashes遇到了这个问题. (3认同)

sup*_*rEb 40

Java 8中的标准方法是Integer.toUnsignedLong(someInt),相当于@Mysticial的答案.


Lou*_*man 17

Guava提供了UnsignedInts.toLong(int)......以及无符号整数上的各种其他实用程序.


Pet*_*rey 7

你可以使用像这样的功能

public static long getUnsignedInt(int x) {
    return x & (-1L >>> 32);
}
Run Code Online (Sandbox Code Playgroud)

但在大多数情况下,您不需要这样做.您可以改用变通方法.例如

public static boolean unsignedEquals(int a, int b) {
    return a == b;
}
Run Code Online (Sandbox Code Playgroud)

有关使用无符号值的变通方法的更多示例.未签名的实用程序类