c# – 识别奇数,偶数 – 二进制与模
发布时间:2020-12-15 17:48:32 所属栏目:百科 来源:网络整理
导读:最近我不得不确定一个数字是奇数还是甚至大量的整数.我想到一个想法,将一个数字识别为奇数,甚至通过将其与1进行比较,并将结果与??1进行比较 x 1 == 1 // even or odd 在实践中我从来没有见过这个实现.你最常见的方式是: x % 2 == 0 我决定对这两种方法进行
最近我不得不确定一个数字是奇数还是甚至大量的整数.我想到一个想法,将一个数字识别为奇数,甚至通过将其与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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读