最近,我开始使用如下表达式:
res += (i + n / i) * !(n % i);
在我假设的地方,它!(n % i)
的值总是 1 或 0,因此可以直接用于计算,而不是编写冗长的 if 语句,如
if(!(n % i))
res += (i + n / i);
如果您想知道,这些行取自我编写的用于计算数字的适当除数之和的函数n
:
unsigned int sum_of_divisors(unsigned int n)
{
unsigned int res = 1;
unsigned int i;
for(i = 2; i < sqrt(n); ++i)
res += (i + n / i) * !(n % i);
res += i * (i * i == n);
return res;
}
我的问题是,这段代码是否保证按照我预期的方式运行?这个(乘法与条件跳转)的大致性能影响是什么?如果合适的话,编译器会这样做吗?
编辑:请注意,我并不特别关心实际代码的性能。我只是想知道,出于纯粹的专业兴趣,两者中哪一个会表现得更好,为什么,以及编译器将如何处理每种情况。
至于我这样写的原因,它很适合我的大脑:)
这很难描述,但至少在某些情况下,我对乘以 1 或 0 而不是三元运算符或 if 语句有更好的感觉。
谢谢,安迪