如何计算余数有什么不同?

时间:2019-05-14 19:56:43

标签: c++ c performance

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

1 个答案:

答案 0 :(得分:6)

对于二进制补数inta的2的幂,b % a等于b & a-1,并且仅当b为非负数或整数倍时a

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

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