编码 2 的幂的最有效方法是对整数进行位移。
1 << n
给我2^n
但是,如果我有一个大于 aint
或 a中允许的最大值的数字long
,我可以使用什么来有效地操纵 2 的幂?
(我需要能够对数字进行加法、乘法、除法和模运算)
编码 2 的幂的最有效方法是对整数进行位移。
1 << n
给我2^n
但是,如果我有一个大于 aint
或 a中允许的最大值的数字long
,我可以使用什么来有效地操纵 2 的幂?
(我需要能够对数字进行加法、乘法、除法和模运算)
这是你需要的吗?
BigInteger hugeNumber = BigInteger.ONE.shiftLeft(n);
这是 n=1000 时的结果,
10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376
您需要对“二的幂”执行哪些操作?例如,如果它只是除法和乘法,您可以只保留log2
2 的幂,然后对它们使用减法和加法。如果不知道你想要什么样的“操纵”,就不可能就如何有效地“操纵”提出好的建议;-)。
看起来java.math.BigInteger
是你需要的。
它有mod
, shiftLeft
, ,shiftRight
当然还有add
,和。它是一种不可变类型 (ala ),因此它可能不是最终最有效的做事方式,但除非您已证明它是性能问题,否则我不会担心。multiply
subtract
divide
String
简单:long
:-)
如果您不介意浮点数,double
可以精确表示 2 到 2^1023 的所有幂。
否则,这取决于你在做什么“操纵”。
需要准确吗?
否则,您可以将其表示为 long 乘以 2 的 int 次方。
例子:
x = 15 * 2^123