如何在Java中对long类型进行2的64次方取模?

7

我正在Java中实现Skein哈希函数,其中一部分涉及到对某些加法取模2^64。正如我们所知,Java中的long类型最大值为2^63-1。因此我的问题是,如何实现这个模运算。 (Skein中的所有操作都在64位字上进行。)


1
如果您不需要它运行得非常快,您可以使用 BigInteger - Sergey Kalinichenko
3个回答

6

Java中的long是64位的,所以所有的运算都已经是模2^64了。你不需要做任何额外的事情来实现这一点。

问题在于你不知道如何处理带符号的值吗?

这是你想要的东西还是你试图避免的东西?


谢谢,这很有帮助。这正是我想要的。我将仅在末尾操作位,因此我不关心符号位。 - Bernard Burn
你唯一需要考虑的问题是在符号有影响的操作中。例如,Long.toString(long)会打印一个符号。然而,许多操作按照你所期望的无符号或有符号位来处理比特。 - Peter Lawrey
在所有操作结束时,我将把所有的64位字组装成512位的Byte[],然后我将把它们解释为十六进制或字符串,但我还不确定。 - Bernard Burn
1
所以你有8个64位长整型。你可以将它们写入ByteBuffer并按字节读取,或者包装一个byte[](而不是Byte[])。 - Peter Lawrey

3

2
除了Peter的回答,我想建议您查看伟大的Guava库。它有一个类UnsignedLongs,提供了几个实用函数来处理long类型,将其视为无符号数。这可能对您有所帮助。

2
UnsignedLongs 的作者在此:Peter 的回答对于无符号长整型基本上是准确的。具体来说,即使将长整型视为无符号值,+、- 和 * 仍然都是正确的。此外,您可能会发现使用 UnsignedLong 包装类很有帮助,它可以像 BigInteger 一样使用,但对于模 2^64 有效。 - Louis Wasserman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接