2016-06-01 127 views
0

我通常用n(數字)%2來檢查它是偶數還是奇數。最近,我通過使用智慧發現了另一種方式。判斷一個數字是奇數還是偶數

if(n&1) 
    cout<<"Odd"; 
else 
    cout<<"Even"; 

它比另一個更快嗎?我應該使用它嗎?謝謝!

+4

'它比另一個更快嗎? ':你有沒有提交任何基準? – 101010

+3

n&1應該更快,因爲它檢查數位串中的第一位是打開還是關閉,'%'操作符必須計算其餘的。 – PRDeving

+1

如果編譯器在這種情況下如何工作,n%2將需要一個乘法和一個減法操作,這些操作都是昂貴的操作。另一方面,&只是一個簡單的操作。 –

回答

6

編譯器可以非常容易地將任一操作優化爲更快的操作,所以在實踐中它可能沒有什麼區別。

我用我的gcc編譯器(ubuntu上的5.3)運行了這個實驗。鑑於這種代碼:

#include <iostream> 

int main() 
{ 

    for(int i=0; i<100; ++i) { 
     //if(i % 2 == 0) 
     if(!(i & 1)) 
      std::cout << "i is odd" << std::endl; 
     else 
      std::cout << "i is even" << std::endl; 
    } 
} 

if線I註釋的哪種,所產生的彙編代碼是完全相同,即:

mov eax, DWORD PTR [rbp-4] # D.35290, i 
and eax, 1 # D.35290, 
test eax, eax # D.35290 

換句話說編譯器產生的與版本兩種情況下的比較。這是默認優化。

+0

我應該使用哪一個? –

+1

按照上面的編輯,它沒有區別。使用任一個。編譯器會選擇AND選項,因爲我猜它認爲它更快 – Smeeheey

+0

@NhânNguyễn使用最明確和最常用的form =>'%2'。總的來說,總是寫出你想要做的事情,而不是一種能夠根據需要進行快速編譯優化的技巧。另外技巧往往不便攜也不可維護 – Garf365

相關問題