假设我把我的整数看作带有4位小数的数。现在,0是零,16是一,32是二,以此类推。在四舍五入时,范围在[-7,7]内的数字变成0,[8,23]内的数字变成16。
我的代码如下:
std::int64_t my_round(std::int64_t n) {
auto q = n / 16;
auto r = n % 16;
if (r >= 0) {
if (r >= 8) {
++q;
}
} else {
if (r <= -8) {
--q;
}
}
return q * 16;
}
这个简单的任务需要很多代码,我想知道是否有更快的方法来完成它。我只需要支持64位带符号整数。
编辑: 有人评论建议添加15并掩码低位,但这并不起作用。但通过一些试错,我想出了以下解决方案。
std::int64_t my_round2(std::int64_t n) {
if (n >= 0) {
n += 8;
}
else {
n += 7;
}
return n & (~15ll);
}
我不知道,但是
my_round2
似乎和my_round
得到了相同的结果,而且速度快了20倍。如果有办法去掉分支,那就更好了。
my_round2()
中,n += 8;
可能导致溢出。Wei Hsieh,您想如何处理溢出? - chux - Reinstate Monicamy_round2(-15)
应该返回什么? - chux - Reinstate Monicamy_round2()
后续步骤会依赖于处理器,适用于 64 位机器的方法在 16 位嵌入式处理器上可能表现极差。也许可以标记感兴趣的处理器系列? - chux - Reinstate Monica