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)
顺便说一句,除非您的输入数据相当随机,否则由于分支预测,无分支代码可能比"分支"代码慢.最好试用这两个版本,看看哪个版本实际上更快.
| 归档时间: |
|
| 查看次数: |
113 次 |
| 最近记录: |