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

这篇博客探讨了在C语言中检查一个整数是奇数还是偶数的最快方法。通过比较`x & 1`和`x % 2`两种方法的效率,发现`x & 1`在某些情况下可能会被编译器优化成更少的指令,从而提高性能。文章提供了多种实现方式,并指出在满足特定条件时,最清晰的代码也可能达到最佳效率。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值