12

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

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

有什么建议吗?

编辑

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

4

1 回答 1

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);
}
于 2013-07-30T13:14:39.530 回答