C++ 判断一个数字是奇数还是偶数

C++ 判断一个数字是奇数还是偶数,c++,C++,我通常使用n(一个数字)%2来检查它是偶数还是奇数。最近,我通过使用bit-wise发现了另一种方法 if(n&1) cout<<"Odd"; else cout<<"Even"; if(n&1) cout编译器可以很容易地将任何一个操作优化为更快的操作,因此在实践中可能没有什么区别 我用我的gcc编译器(ubuntu上的5.3)运行了这个实验。鉴于此代码: #include <iostream> int main() { f

我通常使用n(一个数字)%2来检查它是偶数还是奇数。最近,我通过使用bit-wise发现了另一种方法

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

cout编译器可以很容易地将任何一个操作优化为更快的操作,因此在实践中可能没有什么区别

我用我的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;
    }   
}

换句话说,编译器在这两种情况下都生成了比较的和版本。这是默认的优化。

编译器可以很容易地将任何一个操作优化为更快的操作,因此在实践中可能没有什么区别

我用我的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;
    }   
}

换句话说,编译器在这两种情况下都生成了比较的和版本。这是默认的优化。

它比另一个快吗:您提交了任何基准测试吗?n&1应该更快,因为它会检查数字位字符串中的第一位是否设置为开或关,“%”运算符必须计算其余的位。如果不考虑编译器在这种情况下的操作方式,n%2将需要一个乘法和减法运算,这是一个代价高昂的操作。另一方面,&只是一个简单的操作。@PRDeving是错误的。请不要在评论中发布答案,请将答案放在答案框中,以便可以根据需要进行向下投票。这没关系,只要您使用的是无符号整数。对于有符号整数,您肯定会看到程序集输出中的差异(至少在MSVC上,当
n
是有符号整数时,使用
n%2
会导致丑陋、缓慢的分支代码)。
是否比另一个更快:您提交了任何基准测试吗?n&1应该更快,因为它会检查数字位字符串中的第一位是否设置为开或关,“%”运算符必须计算其余的位。如果不考虑编译器在这种情况下的操作方式,n%2将需要一个乘法和减法运算,这是一个代价高昂的操作。另一方面,&只是一个简单的操作。@PRDeving是错误的。请不要在评论中发布答案,请将答案放在答案框中,以便可以根据需要进行向下投票。这没关系,只要您使用的是无符号整数。对于有符号整数,您肯定会看到程序集输出中的差异(至少在MSVC上,当
n
是有符号整数时使用
n%2
将导致丑陋、缓慢的分支代码)。我应该使用哪一个?根据上面的编辑,这没有什么区别。使用任何一个。编译器将选择AND选项,因为我猜它认为faster@Nh小家伙ễn使用最明确和最常用的形式=>
%2
。一般来说,总是写你想做的事情,而不是做你需要的事情,而是快捷编译器优化。此外,技巧通常不可移植也不可维护。我应该使用哪一个?根据上面的编辑,这没有什么区别。使用任何一个。编译器将选择AND选项,因为我猜它认为faster@Nh小家伙ễn使用最明确和最常用的形式=>
%2
。一般来说,总是写你想做的事情,而不是做你需要的事情,而是快捷编译器优化。此外,这些技巧通常不便于携带或维护