2013-11-25 4 views
0

Я пишу быстро программу, чтобы разложить ряд по степеням 2. Является ли это эффективный способ сделать это:Сбор разложение 2-мощности п (Python, C++)

pows=[] 
    pos = 0 
    while n>0: 
     if n%2==1: pows.append(2**pos) 
     n/=2 
     pos+=1 

Я написал это в Python, но меня также интересует, как это делается на C++.

Я не знаю, является ли это «умным» способом сделать это, или если это считается ужасно неэффективным.

+0

Поиск StackOverflow для "[C++] convert binary". –

+0

Вы можете сделать его более эффективным, аккумулируя фактическую мощность 2 вместо экспоненты. Таким образом, вы избегаете вычисления 2 ** поз. (т. е. начать с 'power = 1', а затем в каждом цикле:' power + = power' (или 'power * = 2'). Кроме того, в python3' n/= 2' не является целым делением, если вам интересно о python3. – rici

+0

Быстрее ли использовать «битмаски»? – user111373

ответ

1

Наиболее естественное внедрение в C++ будет использовать битовую маску для полномочий двух, что-то вроде:

std::vector<unsigned> p2; 
unsigned m = 1; 
while (m != 0) { 
    if ((m & i) != 0) { 
     p2.push_back(m); 
    } 
    m <<= 1; 
} 

Вы, конечно, не хотите, чтобы вызвать функцию pow каждый раз, когда в петля. Несколько обман способ, который, вероятно, быстрее (так как она обычно проходит меньше раз в цикле) будет:

std::vector<unsigned> p2; 
std::cout << i << ": "; 
while (i != 0) { 
    unsigned n = i & i - 1; 
    p2.push_back(i^n); 
    i = n; 
} 

я рекомендовал бы первым (что легко объяснимо) если профайлер действительно не говорит вам должен использовать второй.

1

Любой современный компилятор, вероятно, будет достаточно умным, чтобы его оптимизировать. Сначала убедитесь, что ваш код работает правильно, и беспокоиться об оптимизации скорости после профилирования (если он слишком медленный).

+0

Выражение Python' 2 ** pos' было бы 'pow (2, pos)' в C++. Я был бы очень удивлен, если бы оптимизатор устранил его, и это, вероятно, будет представлять собой очень большой процент его процессора. Я бы очень сильно возражал против преждевременной оптимизации, но в этом case: никогда не вводить плавающую точку, если только вы не должны являться еще более важным правилом. –

+0

@JamesKanze 2 ** pos должен, конечно, быть реализован как (1 << pos) в C++. – zennehoy

+0

@zennehoy is 2 ** или 1 << быстрее в Python? – user111373

Смежные вопросы