假设 a = 2^k
int c = b%a
和 int c = b & (a-1)
在性能或正确性方面有什么区别吗?
最佳答案
对于补码 int
和 a
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/