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