快速双向位移?

时间:2012-04-22 21:25:33

标签: c optimization bit-shift

我有一段代码可以执行很多,我想优化。它看起来像这样:

int exponent;
uint32_t mantissa;

if (exponent < 0) {
    return mantissa << -exponent;
} else {
    return mantissa >> exponent;
}

目的非常明确,它应该mantissaexponent个地方右转,其中exponent可能是负数。

是否有更快的方法对此进行编码(如果可能,没有分支)?

2 个答案:

答案 0 :(得分:4)

当然有。也就是说,一个没有分支的;我不会说它在所有情况下都必须更快。

int exponent;
uint32_t mantissa;

return (uint32_t)( (uint64_t)mantissa << (32-exponent) >> 32 );

答案 1 :(得分:0)

看看这个"integer abs without branching"。这家伙有一套很棒的技巧,包括你想要的。在你的情况下似乎'sizeof(int)* CHAR_BIT'应该用8代替,如果'exponent'变量类型永远不会改变。

顺便说一下,你确定这个特定的'if'声明是由于分支引起的性能问题吗?我的意思是,如果问题在于其他地方的数据位置不佳,那么优化掉分支是没有意义的。