有一种广为人知的模式可以将数字四舍五入到最接近的 2 的幂的倍数。将数字增加 2 的次方,然后删除它下面的任何位:
power = 1 << i
(n + (power - 1)) & ~(power - 1)
对于我的用例,此模式的问题是 0 没有四舍五入。显而易见的解决方案是添加一个分支,但我宁愿避免,因为这段代码的性能非常重要。
在某些情况下,我通过特定于上下文的 hack 避免了这种成本。更改较早的 (x <= FAST_PATH_LIMIT)
条件 (x - 1 <= FAST_PATH_LIMIT - 1)
强制零换行,并允许在慢速路径中处理它。遗憾的是,这样做的机会并不总是可用。
我很乐意接受针对相对晦涩的架构的特定于平台的程序集 hack。我只是想高兴地知道有更好的方法可以做到这一点。不过,C 或 x86/ARM 汇编中的魔术技巧实际上很有用。
最佳答案
如果您希望零和其他已经四舍五入的 2 的幂总是四舍五入,那么:
((n | 1) + (power - 1)) & ~(power - 1)
或者如果只是零
((n | (!n)) + (power - 1)) & ~(power - 1)
许多架构,例如 PPC,具有非分支 (!n)
关于c - 快速舍入数字 >= 0 到 2 的特定幂的倍数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28534030/