对于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)
你可以使用像这样的功能
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)
有关使用无符号值的变通方法的更多示例.未签名的实用程序类
| 归档时间: |
|
| 查看次数: |
59222 次 |
| 最近记录: |