我通常用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将需要一个乘法和一个减法操作,这些操作都是昂贵的操作。另一方面,&只是一个简单的操作。 –