c – 你会使用num%2或num&1来检查一个数字是否均匀?

那么至少有两个低级别的方式来确定一个给定的数字是否是偶数的:

 1. if (num%2 == 0) { /* even */ } 
 2. if ((num&1) == 0) { /* even */ }

我认为第二个选择是更加优雅和有意义的,这是我通常使用的。但这不仅仅是味道的问题,实际的性能可能会有所不同:通常按位操作(比如对数 – 和这里)比mod(或div)操作要好得多。当然,你可能会认为有些编译器能够优化它,而且我同意…但有些编译器不会。

另一点是,第二个可能有点难以理解缺乏经验的程序员。在这一点上,我会回答,如果这些程序员花费很短的时间来理解这种陈述,那么它可能只会使每个人都受益。

你怎么看?

给定的两个片段只有在num是无符号int或具有二进制补码表示的负数时才是正确的。 – 正如一些评论强烈的状态。

如果你要说一些编译器不会优化%2,那么你还应该注意到一些编译器对带符号整数使用一个补码表示。在该表示中,& 1给出负数的错误答案。

那么你想要什么 – “一些编译器”缓慢的代码或者“一些编译器”错误的代码?在每种情况下,并不一定是相同的编译器,但两种都非常罕见。

当然,如果num是一个无符号的类型,或者一个C99的固定宽度整数类型(int8_t等等,它们是2的补码),那么这不是一个问题。在这种情况下,我认为%2更加优雅和有意义,而且1是一个可能有必要有时为了表演而需要的黑客。我认为,例如,CPython不执行此优化,完全解释语言也是如此(尽管解析开销可能会缩小两台机器指令之间的差异)。尽管如此,尽管如此,C / C编译器并没有做到这一点,但是我觉得有点惊讶,因为如果不是这样,那么在发出指令的时候,这是一个没有脑子的事情。

一般来说,我会说,在C中,你完全受到编译器优化能力的怜悯。标准容器和算法具有n个间接级别,当编译器完成内联和优化时,它们大部分都会消失。一个体面的C编译器可以在早餐之前处理常量值的算术,而不客观的C编译器会产生垃圾代码,无论你做什么。

http://stackoverflow.com/questions/1949271/would-you-use-num2-or-num1-to-check-if-a-number-is-even

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c – 你会使用num%2或num&1来检查一个数字是否均匀?