2016-06-01 129 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

相关问题