下面这个例子中使用了两种方法,一种是mod,一种是位运算。
对于位运算的方法,比较好理解,但是对于mod的方法,如果使用不当,就容易得到错误的结果。
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
for(int i=-5; i<=5; ++i) {
cout << "i: " << i << ", i%2: " << i%2 << ", i&1:" << (i&1)<< endl;
if (i%2 == 0) cout << "even\n";
else cout << "odd\n";
if (i&0x1) cout << "odd\n";
else cout << "even\n";
if (i<0 && i&0x1) cout << "wrong: ";
if (i%2 == 1) cout << "odd\n";
else cout << "even\n";
}
return 0;
}
运行结果是:
i: -5, i%2: -1, i&1:1
odd
odd
wrong: even
i: -4, i%2: 0, i&1:0
even
even
even
i: -3, i%2: -1, i&1:1
odd
odd
wrong: even
i: -2, i%2: 0, i&1:0
even
even
even
i: -1, i%2: -1, i&1:1
odd
odd
wrong: even
i: 0, i%2: 0, i&1:0
even
even
even
i: 1, i%2: 1, i&1:1
odd
odd
odd
i: 2, i%2: 0, i&1:0
even
even
even
i: 3, i%2: 1, i&1:1
odd
odd
odd
i: 4, i%2: 0, i&1:0
even
even
even
i: 5, i%2: 1, i&1:1
odd
odd
odd
从上述结果可以看出,要判断一个整数是否为奇数,我们不能用 i%2==1这种判断, 因为负的奇数,i%2= -1。
判断奇数的正确方法应该是:i%2 != 0 或者 i&0x1 == 1。
判断偶数的正确方法应该是:i%2 == 0 或者 i&0x1 == 0。