找出最大和最小两个数字而不使用If else?

kap*_*dit 4 c optimization bit-manipulation bit bitwise-operators

我能够从这里找出逻辑:

r = y ^ ((x ^ y) & -(x < y)); // min(x, y)
r = x ^ ((x ^ y) & -(x < y)); // max(x, y)
Run Code Online (Sandbox Code Playgroud)

它说这比做更快

r = (x < y) ? x : y
Run Code Online (Sandbox Code Playgroud)

有人可以通过示例来解释它以了解它.怎么可能更快?

Lun*_*din 10

在没有特定硬件的情况下讨论优化没有任何意义.如果不深入了解特定系统的细节,你真的无法分清哪种替代方案最快.在没有任何特定硬件的情况下大胆地发表关于第一个替代品最快的声明,只是预先成熟的优化.

如果给定CPU的性能严重依赖于分支预测,那么模糊的xor解决方案可能比比较替代方案更快.换句话说,如果它执行常规指令(例如算术指令)非常快,但在任何条件语句(例如if)中都会遇到性能瓶颈,其中代码可能会以多种方式分支.诸如量指令高速缓冲存储器等的其他因素也很重要.

但是,许多CPU将更快地执行第二种替代方案,因为它涉及更少的操作.

总而言之,你必须成为给定CPU的专家才能在理论上实际告诉哪些代码是最快的.如果您不是这样的专家,只需对其进行基准测试即可.或者看一下反汇编的显着差异.


Dan*_*ein 5

在您提供的链接中,明确说明:

在一些罕见的机器上,分支非常昂贵且没有条件移动指令,[code]可能比明显的方法更快,r =(x <y)?x:y

后来,它说:

在某些机器上,将(x <y)评估为0或1需要分支指令,因此可能没有任何优势.

简而言之,位操作解决方案仅在分支执行较差的机器上更快,因为它仅依赖于操作数的数值.在大多数机器上,分支方法同样快(有时甚至更快),并且应该首选其可读性.