c-查找数字是偶数还是奇数的最快方法是什么?

查找数字是偶数还是奇数的最快方法是什么?

aks asked 2020-07-08T09:46:04Z

11个解决方案

57 votes

众所周知

static inline int is_odd_A(int x) { return x & 1; }

static inline int is_odd_B(int x) { return x % 2; }

但是,在启用优化程序的情况下,is_odd_A是否与is_odd_A没有区别? 否-使用gcc-4.2 -O2,我们得到(在ARM汇编中):

_is_odd_A:

and r0, r0, #1

bx lr

_is_odd_B:

mov r3, r0, lsr #31

add r0, r0, r3

and r0, r0, #1

rsb r0, r3, r0

bx lr

我们看到is_odd_A比is_odd_A多接受了3条指令,主要原因是

((-1) % 2) == -1

((-1) & 1) == 1

但是,以下所有版本将生成与is_odd_A相同的代码:

#include

static inline bool is_odd_D(int x) { return x % 2; } // note the bool

static inline int is_odd_E(int x) { return x % 2 != 0; } // note the !=

这是什么意思? 优化器通常足够复杂,对于这些简单的东西,最清晰的代码足以保证最佳效率。

kennytm answered 2020-07-08T09:46:40Z

7 votes

常用方法:

int number = ...;

if(number % 2) { odd }

else { even }

替代方案:

int number = ...;

if(number & 1) { odd }

else { even }

在GCC 3.3.1和4.3.2上进行了测试,两者的速度大致相同(没有编译器优化),这与and指令(在x86上编译)的结果相同-我知道使用div指令进行模运算会慢很多,因此 我根本没有测试。

AndiDog answered 2020-07-08T09:47:10Z

6 votes

bool is_odd = number & 1;

digitalarbeiter answered 2020-07-08T09:47:25Z

5 votes

如果(x&1)为true,则为奇数,否则为偶数。

Vicky answered 2020-07-08T09:47:46Z

2 votes

int i=5;

if ( i%2 == 0 )

{

// Even

} else {

// Odd

}

lamas answered 2020-07-08T09:48:01Z

2 votes

如果是整数,则可能只检查最低有效位。 零将被视为偶数。

Marcel answered 2020-07-08T09:48:21Z

2 votes

可移植的方式是使用模运算符x % 2:

if (x % 2 == 0) // number is even

如果您知道只使用二进制补码架构,则可以按位和:

if (x & 0x01 == 0) // number is even

使用模运算符会使代码相对于按位和变慢。 但是,除非满足以下所有条件,否则我会坚持使用:

您无法满足严格的性能要求;

您经常执行x % 2(例如,执行数千次的紧密循环);

分析表明使用mod运算符是瓶颈。

性能分析还表明,按位使用-可以缓解瓶颈,并可以满足性能要求。

John Bode answered 2020-07-08T09:49:08Z

2 votes

检查最后一位是否为1。

int is_odd(int num) {

return num & 1;

}

0xfe answered 2020-07-08T09:49:28Z

1 votes

int is_odd(int n)

{

if (n == 0)

return 0;

else if (n == 1)

return 1;

else

return !is_odd(n - 1);

}

哦,等等,您说的最快的方法,不是最有趣的。 我的错 ;)

上述功能当然只适用于正数。

Maurits Rijk answered 2020-07-08T09:49:52Z

1 votes

您的问题未完全指定。 无论如何,答案取决于您的编译器和计算机的体系结构。 例如,您在使用一个补码还是两个补码符号表示的机器上?

我写的代码首先是正确的,其次是清晰的,其次是简洁的,最后是快速的。 因此,我将该程序编写如下:

/* returns 0 if odd, 1 if even */

/* can use bool in C99 */

int IsEven(int n) {

return n % 2 == 0;

}

这种方法是正确的,它比测试LSB更清楚地表达了意图,它简洁明了,不管您信不信由你,它正在快速发展。 当且仅当分析告诉我该方法是我的应用程序的瓶颈时,我才考虑偏离它。

jason answered 2020-07-08T09:50:23Z

0 votes

检查最低有效位:

if (number & 0x01) {

// It's odd

} else {

// It's even

}

holygeek answered 2020-07-08T09:50:43Z

c语言查找偶数,c-查找数字是偶数还是奇数的最快方法是什么?相关推荐

  1. 判断奇偶数的程序c语言子函数,C程序检查数字是偶数还是奇数

    C程序检查数字是偶数还是奇数 在此示例中,您将学习检查用户输入的数字是偶数还是奇数. 要理解此示例,您应该了解以下C语言编程主题: 偶数是可以被2整除的整数.例如:0.8,-24 奇数是不能被2整除的 ...

  2. 数字0是奇数还是偶数_C程序检查数字是偶数还是奇数

    数字0是奇数还是偶数 Here you will get C program to check given number is even or odd. 在这里,您将获得C程序来检查给定的数字是偶数还 ...

  3. C语言 统计输入任意多数字的偶数和奇数的个数,并输出相应的内容

    方法一:单纯应用数组实现. #include<stdio.h> main() {int a[100],i,j,m=0,n=0,k=0; //数组上限定为100char s;printf(& ...

  4. 二分查找算法举例说明C语言,C语言快速排序与二分查找算法示例

    本文实例讲述了C语言二分排序与查找算法.分享给大家供大家参考,具体如下: 题目:首先产生随机数,再进行快速排序,再进行二分查找. 实现代码: #include #include #include vo ...

  5. c语言对随机数进行快速排序,C语言快速排序与二分查找算法示例

    本文实例讲述了C语言二分排序与查找算法.分享给大家供大家参考,具体如下: 题目:首先产生随机数,再进行快速排序,再进行二分查找. 实现代码: #include #include #include vo ...

  6. c语言实验报告 折半查找法,C语言数组之冒泡排序+折半查找法(二分查找)

    冒泡排序算法 将相邻的元素进行两两比较,大的向后"冒", 小的向前"赶". 口诀: N个数字来排队,两两比较小靠前 外层循环N-1(控制需要比较的轮数). 内层 ...

  7. 数据结构源码笔记(C语言):顺序查找

    //实现顺序查找的算法 #include<stdio.h> #include<malloc.h> #include<malloc.h>#define MAXL 10 ...

  8. 数据结构源码笔记(C语言):二分查找

    //实现二分查找的算法#include<stdio.h> #include<malloc.h> #include<malloc.h>#define MAXL 100 ...

  9. c语言折半查找递归程序,C语言数据结构中二分查找递归非递归实现并分析

    C语言数据结构中二分查找递归非递归实现并分析 前言: 二分查找在有序数列的查找过程中算法复杂度低,并且效率很高.因此较为受我们追捧.其实二分查找算法,是一个很经典的算法.但是呢,又容易写错.因为总是考 ...

最新文章

  1. apktoolkit apk反编译没有文件_重新编译mono——修改apk中Assembly-CSharp.dll并重新打包...
  2. 计算机组成算术流水线,计算机组成系统结构试题整理.doc
  3. 华人首位!清华学子尤洋 荣升新加坡国立大学“校长青年教授”
  4. 微盘 计算机英语,高中英语,微盘.doc
  5. boost::hana::reverse_fold用法的测试程序
  6. Java基本语法(14)--for循环结构
  7. mediawiki mysql_MediaWiki
  8. java activity模式_Activity的启动模式
  9. ToString函数用法
  10. 怎么在服务器添加充值网站,云服务器怎么弄充值
  11. H3C 模拟器 pc与sw直连 开启telnet
  12. Linux之相关英文缩写含义
  13. ALOHA simulaiton仿真结果及分析
  14. 驻马店远大计算机阳业学院,电力学院
  15. 由一维数组表示的N维数组实现(C++)
  16. ArcView GIS 应用与开发技术(10)-影像操作
  17. ​​spss13.0 附安装教程
  18. 常用HTML5开发工具有哪些?
  19. esxi虚拟化服务器端口聚合,配置链路聚合组处理分布式端口组的流量
  20. 今天不开心 和话痨机器人聊一会

热门文章

  1. Oxygen XML Editor Mac版(基于Java的XML编辑器)
  2. 论文翻译:Learning Representations and Generative Models for 3D Point Clouds
  3. npm报错npm ERR code ELIFECYCLE
  4. 设计大牛不愿意告诉小白的6款设计软件
  5. Spark源码走读概述
  6. python扫雷 高级算法_利用Python实现自动扫雷
  7. 机器学习基础(一)混淆矩阵,真阳性(TP),真阴性(TN),假阳性(FP),假阴性(FN)以及敏感性(Sensitivity)和特异性(Specificity)
  8. seatunnel 高性能分布式数据集成平台
  9. PCIe学习(二):PCIe DMA关键模块分析之一
  10. 【转】小生我怕怕工具包[2010.06.17](转自52破解论坛)