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

Java 将有符号整数转换为无符号长整数的最佳方法?,java,unsigned,Java,Unsigned,对于Java中的某些散列函数,最好将值视为无符号整数(例如,用于与其他实现进行比较),但Java只支持有符号类型。我们可以将有符号的int转换为“无符号的”long,如下所示: 公共静态最终整数位每字节=8; 公共静态长getUnsignedInt(int x){ ByteBuffer buf=ByteBuffer.allocate(Long.SIZE/位/字节); buf.putInt(整数.SIZE/位/字节,x); 返回buf.getLong(0); } getUnsignedInt(-1

对于Java中的某些散列函数,最好将值视为无符号整数(例如,用于与其他实现进行比较),但Java只支持有符号类型。我们可以将有符号的
int
转换为“无符号的”
long
,如下所示:

公共静态最终整数位每字节=8;
公共静态长getUnsignedInt(int x){
ByteBuffer buf=ByteBuffer.allocate(Long.SIZE/位/字节);
buf.putInt(整数.SIZE/位/字节,x);
返回buf.getLong(0);
}
getUnsignedInt(-1);//=>4294967295
然而,这个解决方案对于我们真正正在做的事情来说似乎有点过头了。有没有更有效的方法来实现同样的目标?

类似的方法

int x = -1;
long y = x & 0x00000000ffffffffL;
还是我遗漏了什么

public static long getUnsignedInt(int x) {
    return x & 0x00000000ffffffffL;
}
其他解决方案

public static long getUnsignedInt(int x) {
    if(x > 0) return x;
    long res = (long)(Math.pow(2, 32)) + x;
    return res;
}

提供…以及关于无符号整数的各种其他实用程序。

您可以使用以下函数

public static long getUnsignedInt(int x) {
    return x & (-1L >>> 32);
}
但是,在大多数情况下,您不需要这样做。您可以使用变通方法。e、 g

public static boolean unsignedEquals(int a, int b) {
    return a == b;
}
有关使用无符号值的变通方法的更多示例

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

这里只有我的2美分,但我认为这是一个很好的做法:

public静态长getUnsignedInt(int x){
返回x&(~0L);//~的优先级高于&因此不需要括号
}

而不是:

返回x&0xFFFFFFFFL


在这种情况下,你不必担心面具有多少个“F”。它将永远有效

Java 8中的标准方法是,这相当于。

Math.pow非常昂贵,每次都要计算。通过比较
1l,你能给我一些关于这些转换如何工作的链接或描述吗?我不理解。因为int是32位的,用2的补码表示。您可以在wikipedia()中检查2的补码以获取更多信息details@Paranaix我相信这也会起作用。我写了这个答案已经有一段时间了,所以我认为我用零填充的原因已经过时了,因为我主要是C++和整数提升规则,有了签名/无符号类型的复杂度。我在程序中犯了一个严重错误,因为我没有测试它((getUnsignedInt似乎按原样工作。
>
是正确的。
>
导致符号扩展,并且-1L右移符号扩展的任何量都会导致所有的值。这是完全错误的。int被提升为long,然后用64位字符串屏蔽它,但不起任何作用。以下prints-1而不是4294967295:inti=-1;long j=i&(~0L);System.out.println(j);是的,这是我的错,我把0xffffffl和~0L混淆了,这显然不是问题所在。请阅读关于两个补码()的内容,它描述了符号数字通常是如何表示的。解决这个问题时,你不能只取绝对值()。
long abs(int num){
    return num < 0 ? num * -1 : num;
}