计算与C中数字符号相反的最快方法

1 c performance bit-manipulation

我们都知道sgn()功能.它可以在C中实现,就像这些东西一样:

inline int sgn(int x)
{
    if(x > 0) {
        return 1;
    } else if(x < 0) {
        return -1;
    } else {
        return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,更高效的无分支版本:

inline int sgn(int x)
{
    return (x > 0) - (x < 0);
}
Run Code Online (Sandbox Code Playgroud)

我想知道的是计算给定数字符号相反的最快方法,可以这样写:

inline int asgn(int x)
{
    if(x > 0) {
        return -1;
    } else if(x < 0) {
        return 1;
    } else {
        return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道的最快的方法:

inline int asgn(int x)
{
    return (x >> (sizeof(x) * CHAR_BIT - 1)) | !!x;
}
Run Code Online (Sandbox Code Playgroud)

这种方法的唯一流程是它依赖于有符号数字的正确位移算术,根据标准,它不一定是这种情况.有更快和/或更便携的解决方案吗?

Dan*_*Dan 10

难道你不能只是改变顺序

inline int sgn(int x)
{
    return (x > 0) - (x < 0);
}
Run Code Online (Sandbox Code Playgroud)

inline int asgn(int x)
{
    return (x < 0) - (x > 0);
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,除非您的输入数据相当随机,否则由于分支预测,无分支代码可能比"分支"代码慢.最好试用这两个版本,看看哪个版本实际上更快.