我正在将一些C++代码移植到Java代码。
java中没有可以容纳64位的无符号数据类型。
我有一个哈希码,它存储在Java的long数据类型中(当然是带符号的)。
long vp = hashcode / 38; // hashcode is of type 'long'因为这里的38大于2,所以生成的数字可以安全地用于java中的任何其他算术。
问题是,如果“hashcode”中的有符号位被设置为1,我不想在变量vp中得到负值。我想要一个正值,就好像数据类型是无符号的一样。
附言:由于性能问题,我不想使用Biginteger来达到这个目的。
发布于 2012-10-29 10:09:43
Java的原始整数类型被认为是有符号的,对此您实际上无能为力。但是,根据您需要它的用途,这可能无关紧要。
由于整数都是在2的补码中完成的,因此在二进制级别上,有符号和无符号是完全相同的。不同之处在于您如何解释它们,以及在某些操作中。具体来说,右移位、除法、模数和比较是不同的。无符号右移位可以使用>>>运算符完成。只要您不需要缺少的运算符之一,您就可以很好地使用long。
发布于 2012-10-29 13:05:15
如果您可以使用第三方库,则可以使用Guava的UnsignedLongs类将long值视为无符号的,用于许多目的,包括除法。(披露:我为Guava做出了贡献。)
发布于 2012-10-31 05:41:10
这就是我解决这个问题的方法。将哈希码右移1位(除以2)。然后将右移的数字除以19(即38/2)。因此,基本上我将数字除以38,就像在c++中一样。我得到了与在c++中相同的值
https://stackoverflow.com/questions/13115015
复制相似问题