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