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

时间:2012-03-06 05:57:53

标签: 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

然而,这个解决方案对于我们真正做的事情来说似乎有些过分。是否有更有效的方法来实现同样的目标?

7 个答案:

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