让我们假设a = 2 ^ k
int c = b%a
和int c = b & (a-1)
在性能或正确性方面有什么区别吗?
答案 0 :(得分:6)
对于二进制补数int
和a
的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
是常数。