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

Hos*_*ein 6 c c++ performance

假设a = 2 ^ k int c = b%aint c = b & (a-1)?之间在性能或正确性方面存在任何差异。

Eri*_*hil 6

对于2的补数int和2 a的幂,当且仅当为非负数或的倍数时,才b % a等于。b & a-1ba

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

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