如何计算余数有什么区别吗?

Any difference for how to calculate remainder?

本文关键字:什么 区别 余数 何计算 计算      更新时间:2023-10-16

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

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

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

当然,编译器可以通过使其成为unsigned int来确保b是非负数的。确保编译器知道a是 2 的幂更为复杂,除非a是一个常数。