在我们日常的编程当中,常常会遇到判断某个整数属于奇数还是偶数的情况。 一般我们都是用的取模的操作,前几天在网上看到了一种称作快速有效的判断做法,利用2进制进行判断。
大家都知道,奇数的最低位一定是1,而偶数的最低位一定是0.所以我们可以根据这个特性,让需要判定的整数和1进行“与”运算,这样就只留下了原数的最低位,然后直接判断这个数等于1还是等于0即可。
实现代码如下:
1
class Program
2
{
3
static void Main(string[] args)
4
{
5
bool s = OddEven.IsEven(4);
6
Console.WriteLine(s);
7![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
8
s = OddEven.IsOdd(55877554);
9
Console.WriteLine(s);
10
}
11
}
12![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
13
/// <SUMMARY>
14
/// 判断一个整数是奇数还是偶数。
15
/// </SUMMARY>
16
class OddEven
17
{
18
static private int s = 1;
19![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
20
static public bool IsEven(int a)
21
{
22
return ((a & s) == 0);
23
}
24![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
25
static public bool IsOdd(int a)
26
{
27
return !IsEven(a);
28
}
29
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
14
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
16
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
17
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
18
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
19
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
20
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
21
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
22
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
23
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
24
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
25
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
26
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
27
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
28
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
29
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
本人做了个测试来证明这个结论,使用取模的方式和使用与操作的方式比较,各运行5,000,000,000次(数据太小看不出差距),前者的执行所花时间是后者的8倍.理论上这种方式的的确效率高一些,也算是一种有高效简洁的方式,但是要体现出差距来就需要至少上亿次的操作才能看出,对于平时只使用那么几次的代码来说,几乎可以忽略不计这两者的差别了.但是使用与操作的话,如果不加注释,很难从代码里看出来作者想要得到一个整数的奇偶性结果,不利于代码阅读.
现在的年代硬件不是问题,在可读性的要求大于代码性能要求(性能也不能差得离谱)的时候,还是少用为好.但是作为开拓视野的一种方式也未尝不可.
工作五年,长期从事于asp.net方面的编程,业余爱好VC编程,温和、谦虚、自律、自信、善于与人交往沟通