c# – 识别奇数,偶数 – 二进制与模

最近我不得不确定一个数字是奇数还是甚至大量的整数.我想到一个想法,将一个数字识别为奇数,甚至通过将其与1进行比较,并将结果与​​1进行比较
x & 1 == 1 // even or odd

在实践中我从来没有见过这个实现.你最常见的方式是:

x % 2 == 0

我决定对这两种方法进行一些性能检查,并且我的机器上的二进制方法似乎稍微快一些.

int size = 60000000;
List<int> numberList = new List<int>();
Random rnd = new Random();

for (int index = 0; index < size; index++)
{
    numberList.Add(rnd.Next(size));
}

DateTime start;
bool even;

// regular mod
start = DateTime.Now;
for (int index = 0; index < size; index++)
{
    even = (numberList[index] % 2 == 0);
}
Console.WriteLine("Regualr mod : {0}",DateTime.Now.Subtract(start).Ticks);

// binary 
start = DateTime.Now;
for (int index = 0; index < size; index++)
{
    even = ((numberList[index] & 1) != 1);
}
Console.WriteLine("Binary operation: {0}",DateTime.Now.Subtract(start).Ticks);

Console.ReadKey();

有没有人看到二进制方法实现?任何缺点?

解决方法

嗯,是的,这是一个轻微的优化.此代码段:
uint ix = 3; // uint.Parse(Console.ReadLine());
        bool even = ix % 2 == 0;

在发布版本中生成此机器代码

uint ix = 3;
0000003c  mov         dword ptr [ebp-40h],3 
            bool even = ix % 2 == 0;
00000043  mov         eax,dword ptr [ebp-40h] 
00000046  and         eax,1 
00000049  test        eax,eax 
0000004b  sete        al   
0000004e  movzx       eax,al 
00000051  mov         dword ptr [ebp-44h],eax

请注意,JIT编译器足够聪明才能使用AND处理器指令.它不是像%操作符正常执行的分区.在那里..

但您的自定义测试会生成代码

uint ix = uint.Parse(Console.ReadLine());
// Bunch of machine code
        bool even = (ix & 1) == 0;
00000024  test        eax,1 
00000029  sete        al   
0000002c  movzx       eax,al 
0000002f  mov         esi,eax

我不得不改变赋值语句,因为JIT编译器突然聪明,并在编译时评估表达式.代码非常相似,但是AND指令被TEST指令所取代.保存一个指令的过程.相当讽刺的是,这次如何选择不使用AND

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...