2013-04-15 2 views
2

Мне нужно суммировать мощность 2 от любой цифры x до 0. Если x = 6, желаемая сумма равна 2pow6 + 2pow5 + ..... 1. Хотя я всегда могу написать алгоритм, чтобы свести к нулю с помощью Math.pow - эта функция кажется печально известной в цикле. Был бы признателен, если бы кто-то мог помочь достичь того же, используя сменные двоичные операторы - я слышал, что они намного эффективнее, чем pow.Math pow альтернатива в java

+0

" эта функция кажется печально известной »- вы протестировали это? Какие значения 'x' вы можете разумно ожидать и критически важны? Что у вас уже есть? – thegrinner

+2

Это сумма геометрической прогрессии, есть формула для этого – BlackJoker

+1

@thegrinner. Для записи быстрый микро-тест показывает, что 'pow (2,10)' примерно в 160 раз медленнее, чем '1 << 10'. – assylias

ответ

10

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

+2

Глупо от меня. Иногда технология заставляет нас забыть, что математика может иметь решение тоже !!! – 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