0

我正在将一些 C++ 代码移植到 Java 代码中。

java中没有可以容纳64位的无符号数据类型。

我有一个哈希码,它存储在 Java 的long数据类型中(当然是签名的)。

long vp = hashcode / 38; // hashcode is of type 'long'

因为这里的 38 大于 2,所以得到的数字可以安全地用于 java 中的任何其他算术。

问题是如果“哈希码”中的有符号位设置为 1 会怎样。我不想在变量 vp 中得到负值。我想要一个正值,就好像数据类型是无符号的一样。

PS:由于性能问题,我不想为此目的使用 Biginteger。

4

3 回答 3

5

Java 的原始整数类型被认为是有符号的,您对此无能为力。但是,根据您的需要,这可能无关紧要。

由于整数都是在二进制补码中完成的,所以有符号和无符号在二进制级别是完全相同的。不同之处在于您如何解释它们以及在某些操作中。具体来说,右移、除法、取模和比较不同。无符号右移可以用>>>操作符来完成。只要您不需要缺少的运算符之一,您就可以long完美地使用 s。

于 2012-10-29T02:09:42.857 回答
1

如果您可以使用第三方库,例如,您可以使用 Guava 的UnsignedLongs类将long值视为无符号用于多种用途,包括除法。(披露:我为 Guava 做出了贡献。)

于 2012-10-29T05:05:15.493 回答
0

那么这就是我如何解决这个问题。将哈希码右移 1 位(除以 2)。然后将该右移数字除以 19(即 38/2)。所以基本上我将这个数字除以 38,就像它在 c++ 中所做的那样。我得到的值与我在 c++ 中得到的值相同

于 2012-10-30T21:41:10.090 回答