2013-04-15 60 views
2

我需要将任意数字x的幂从2减小到0. 如果x = 6,所需总和为2pow6 + 2pow5 + ..... 1。 虽然我总是可以使用Math.pow编写一个算法以减少到0--这个函数在循环中似乎臭名昭着的性能。 希望如果有人能够帮助实现相同的使用移位二元运算符 - 我听说他们比pow更高效。java中的数学公式替代

+0

“这个功能似乎臭名昭着的性能明智的“ - 你测试过吗?你可以合理预期什么'x'的值,并且性能至关重要?你现在有什么? – thegrinner

+2

这是一个几何级数的总和,有一个公式可以做到这一点 – BlackJoker

+1

@thegrinner对于记录来说,一个快速的微型基准测试显示'pow(2,10)'比'1 << 10'慢了160倍。 – assylias

回答

10

2^N + 2 ^(N-1)+ 2 ^(N-2)+ ... + 2 + 1 =(2 ^(N + 1) - 1)= ((1 << (n+1)) - 1)

+2

愚蠢的me.Sometimes技术让我们忘记数学也可能有解决方案! – IUnknown

+1

有史以来最聪明最漂亮的答案 – Khanser

+0

哇!干净有用! +1! – mustache1up

6

您不必计算它在一个循环,你正在试图计算相当于

Math.pow(2, x+1) - 1 

更妙的是,你可以计算出它像torquestomp建议,这将是更快:

(1 << (x + 1)) - 1 
+0

'Math.pow'有两个参数。你不是指'Math.pow(2,x + 1) - 1'吗? –

+0

@KlasLindbäck确切地说,谢谢 – piokuc