2013-11-25 41 views
0

我寫一個快速程序分解一個數字2的冪這是一種有效的方式做到這一點:收集n(的Python,C++)的2功率分解

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

我已經用Python編寫的,但我也對如何在C++中完成它感興趣。

我不知道這是否是一種「聰明」的方式來做到這一點,或者它被認爲是非常低效的。

+0

搜索StackOverflow for「[C++] convert binary」。 –

+0

您可以通過累積2的實際冪而不是指數來提高效率。這樣你可以避免計算2 ** pos。 (即以'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++中,如果優化器消除了它,我會感到非常驚訝,並且它可能佔CPU的很大一部分,我通常會強烈反對過早優化,但是在這case:除非必須是更重要的規則,否則不要引入浮點數 –

+0

@JamesKanze 2 ** pos當然應該在C++中實現爲(1 << pos) – zennehoy

+0

@zennehoy是2 **或1 <<在Python中更快? – user111373