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

pla*_*cel 10 c++ algorithm bit-manipulation c++11

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

inline int32_t max(int32_t a, int32_t b)
{ 
    return a - ((a-b) & (a-b)>>31);
}
Run Code Online (Sandbox Code Playgroud)

有什么建议?

编辑

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

cma*_*ter 8

这段代码有什么作用?它取值a和差值a - b.当然a - (a - b)b.并(a - b) >> 31简单地创建一个iff a - b为负的掩码.

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

inline uint32_t umax(uint32_t a, uint32_t b) {
    return (uint32_t)max((int32_t)a, (int32_t)b);
}
Run Code Online (Sandbox Code Playgroud)