c++ - 如何计算余数有什么不同吗?

标签 c++ c performance

假设 a = 2^k int c = b%aint c = b & (a-1) 在性能或正确性方面有什么区别吗?

最佳答案

对于补码 inta 2 的幂,b % a 等于 b & a-1 当且仅当 b 是非负数或 a 的倍数时。

因此,只有当编译器知道 b 是非负数时,它才能将 b % a 替换为 b & a-1或者知道它是 a 的倍数。 (在后一种情况下,它应该用零替换表达式。)在典型的当前处理器上,AND 和减法指令至少与求余(除法)指令一样快,而且通常更快,所以 b & a-1 是首选,寻求性能的程序员如果知道条件已满足,就应该使用它,除非他们确定编译器将为 b % a 生成 AND 或者他们还需要商 b/a。 (如果需要商,编译器必须生成除法指令,处理器通常会提供余数和商。)

当然,编译器可以通过将b 设为unsigned int 来确保它是非负的。确保编译器知道 a 是 2 的幂更复杂,除非 a 是常量。

关于c++ - 如何计算余数有什么不同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56137757/

相关文章:

c++ - mysqlcppconn 程序中的内存泄漏

c++ - 转发模板参数

c - 如何在 C 中使用函数(初学者)

c - 如何在 C 中连接常量/文字字符串?

c - 将目录依赖项指定为百分比规则时,Linux 上的 Make 行为非常奇怪

c++ - 构建小型中小企业客户端的未定义引用

c++ - 如何使用外部dll库编译代码

mysql - 如何优化SQL查询? key 未被使用

c++ ->4D 阵列 MatLab 的巨大性能损失的原因?

performance - Seq.map 比常规 for 循环更快?