我通常用n(數字)%2來檢查它是偶數還是奇數。最近,我通過使用智慧發現了另一種方式。判斷一個數字是奇數還是偶數
if(n&1)
cout<<"Odd";
else
cout<<"Even";
它比另一個更快嗎?我應該使用它嗎?謝謝!
我通常用n(數字)%2來檢查它是偶數還是奇數。最近,我通過使用智慧發現了另一種方式。判斷一個數字是奇數還是偶數
if(n&1)
cout<<"Odd";
else
cout<<"Even";
它比另一個更快嗎?我應該使用它嗎?謝謝!
編譯器可以非常容易地將任一操作優化爲更快的操作,所以在實踐中它可能沒有什麼區別。
我用我的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
換句話說編譯器產生的與版本兩種情況下的比較。這是默認優化。
'它比另一個更快嗎? ':你有沒有提交任何基準? – 101010
n&1應該更快,因爲它檢查數位串中的第一位是打開還是關閉,'%'操作符必須計算其餘的。 – PRDeving
如果編譯器在這種情況下如何工作,n%2將需要一個乘法和一個減法操作,這些操作都是昂貴的操作。另一方面,&只是一個簡單的操作。 –