无符号整数的快速无分支最大值

时间:2013-07-30 12:59:50

标签: c++ algorithm c++11 bit-manipulation

我从AGGREGATE Magic找到了一个快速计算最大值的技巧。这是整数的唯一问题,但是我已经尝试了一些东西,不知道如何为无符号整数制作一个版本。

inline int32_t max(int32_t a, int32_t b)
{ 
    return a - ((a-b) & (a-b)>>31);
}

有什么建议吗?

修改

不要使用它,因为正如其他人所说,它会产生未定义的行为。对于任何现代架构,编译器都能够从return (a > b) ? a : b发出无分支条件移动指令,这将比相关函数更快。

1 个答案:

答案 0 :(得分:8)

这段代码有什么作用?它取值a和差值a - b。当然,a - (a - b)b。如果(a - b) >> 31为负数,a - b只会创建一个掩码。

如果您在减法上出现溢出,则此代码不正确。然而,这与无符号整数的故事相同。因此,如果您满意这一事实,即您的代码在整个值范围内不正确,您可以简单地忽略无符号并使用它:

inline uint32_t umax(uint32_t a, uint32_t b) {
    return (uint32_t)max((int32_t)a, (int32_t)b);
}