性能问题
可以实现模运算,使得每次计算具有余数的除法。对于特殊情况,在某些硬件上,存在更快的替代方案。例如,2的幂的模可以替代地表示为按位 AND运算:
x % 2^n == x & (2^n - 1)
示例(假设x是正整数):
x % 2 == x & 1
x % 4 == x & 3
x % 8 == x & 7
在比模数更有效地实现按位运算的设备和软件中,这些替代形式可以导致更快的计算。
优化编译器可以识别表单的表达式(表达式%常量),其中常量是2的幂,并自动将它们实现为(表达式&(常量-1))。
这可以允许在不影响性能的情况下编写更清晰的代码。 除非被除数是无符号整数类型,否则对于模运算结果具有被除数符号(包括C)的语言,这种优化是不可能的。 这是因为,如果被除数为负数,则模数将为负数,而(表达式&(常数-1))将始终为正数。