我知道shiftLeft(int n)
类有方法shiftRight(int n)
和BigInteger
,它只将int类型作为参数,但我必须将它移动long
变量。有没有办法做到这一点?
答案 0 :(得分:5)
BigInteger只能有Integer.MAX_VALUE位。向右移动超过此值将始终为零。向左移动任何值,但零将是溢出。
来自Javadoc
* BigInteger constructors and operations throw {@code ArithmeticException} when
* the result is out of the supported range of
* -2<sup>{@code Integer.MAX_VALUE}</sup> (exclusive) to
* +2<sup>{@code Integer.MAX_VALUE}</sup> (exclusive).
如果您需要超过20亿位代表您的价值,那么您有一个相当常见的问题,BigInteger不适用于。
如果您需要进行大规模的位操作,我建议使用BitSet[]
这将允许最多2个bn的2位,超过可寻址的内存。
是的,长变量可能达到10 ^ 10
对于每个10^10
位数,您需要1.25 TB的内存。对于这种大小的数据,您可能需要将其存储在堆之外,我们有一个库可以将这么多数据保存在单个内存映射中而不需要使用太多堆,但是您至少需要在单个磁盘上有这么多空间。 https://github.com/OpenHFT/Chronicle-Bytes
答案 1 :(得分:4)
BigInteger
不支持long
移位金额适当的值。我试过了
BigInteger a = BigInteger.valueOf(2).pow(Integer.MAX_VALUE);
我得到以下例外:
线程“main”中的异常java.lang.ArithmeticException:BigInteger会溢出支持的范围。
答案 2 :(得分:0)
由于2 ^ X
等于10 ^ (X * ln(2) / ln(10))
,我们可以计算X = 10 ^ 10
:
2 ^ (10 ^ 10) = 10 ^ 3,010,299,956.63981195...
= 10 ^ 3,010,299,956 * 10 ^ 0.63981195...
= 4.3632686... * 10 ^ 3,010,299,956
含义4后跟超过3 十亿的数字。
这是一个非常大的数字,需要做一些完全精确的存储。