有一种广为人知的模式,用于将数字四舍五入到最接近的 2 的幂的倍数。将数字增加一个小于 2 的幂,然后清除它下面的所有位:

power = 1 << i
(n + (power - 1)) & ~(power - 1)

对于我的用例,这种模式的问题是 0 没有四舍五入。显而易见的解决方案是添加一个分支,但我宁愿避免,因为此代码的性能非常重要。

在某些情况下,我通过特定于上下文的 hack 避免了这种成本。将较早的 (x <= FAST_PATH_LIMIT) 条件更改为 (x - 1 <= FAST_PATH_LIMIT - 1) 会强制零换行,并允许在慢速路径中处理它。可悲的是,这样做的机会并不总是可用的。

对于相对晦涩的架构,我很乐意接受特定于平台的程序集黑客。我只是想知道有更好的方法可以做到这一点。不过,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/

10-14 19:53