c - 快速舍入数字 >= 0 到 2 的特定幂的倍数

标签 c assembly bit-manipulation

有一种广为人知的模式可以将数字四舍五入到最接近的 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/

相关文章:

python - 理解Python中的按位NOT

c - 这是什么?获取proccount

c - 是 Linux 中文件中的空白两个字节(从 C 读取)

c - 为什么会导致执行错误呢?

c - 跳转到数据段

c++ - 在这个位移操作中做了什么?

c - 宏未声明,但在 header 中定义

php - 来自 php 的系统调用

c - LINUX Kill_pid 失败

assembly - C64汇编存储内存地址并增加它