首页 > 解决方案 > if(n%2==0) 或 if(n&1==0) 哪个更快找到偶数?

问题描述

if(n%2==0) 或 if(n&1==0) 哪个更快找到偶数?

def isEven(n):
    if n%2 == 0:
        return True
    return False
OR

def isEven(n):
    if n&1 == 1:
        return False
    return True

标签: mathbit-manipulationmodulo

解决方案


我希望这些表达式等效于等效地实现这两个选项的语言的合理优化编译器。

事实上,我尝试了四种不同的 C++ 编译器:gcc、clang、MSVC 和 icc,虽然每个编译器都实现了与其他编译器不同的习语1,但四分之三的编译器以相同的方式实现了这两个习语。

只有 icc 生成了不同的代码,并且在这种情况下(n & 1) == 0生成的代码比n % 2 == 0- 但您应该考虑到一个 icc 错误。

但是, 并非所有语言都实现优化编译器(提前或 JIT),特别是解释器可能会或可能不会类似地优化它。如果您对特定语言或平台感兴趣,您可以考虑标记您的问题以反映这一点。


1对于如此简单的代码,这实际上是令人惊讶和不寻常的。总体而言,clang 生成了最好的代码,其次是 MSVC,然后是 gcc。icc 为该n % 2选项生成了非常糟糕的代码。奇怪的是,gcc 在-O1-O2.


推荐阅读