Bil*_*ean 1 c++ conditional function
我有一个数学函数,它依赖于三个变量{n,a和b}
当n是偶数时,{a = n + 1,b = n}
当n为奇数时,{b = n + 1,a = n}
我的函数被调用很多次,各种N-.有没有一种有效的方法来实现它?我认为从长远来看a switch和if声明可能效率不高.
编辑:这是一个最小的例子:
void func(int n)
{
int a, b;
if(!(n%2))
{
a=n+1;
b=n;
}
else
{
a=n;
b=n+1;
}
//continue ...
}
Run Code Online (Sandbox Code Playgroud)
只要使用的数字系统是二进制补码(即-1 == ~0),就可以使用:
int odd = n & 1;
a = n + !odd; // Adds one if n is even
b = n + odd; // adds one if n is odd.
Run Code Online (Sandbox Code Playgroud)
这个解决方案避免了这两者% 2,即使对于2可以变得多一点& 1,也避免了if.它应该明显快于if解决方案,并且可能比解决方案好一点% 2.
如果数字系统不知道是2的补码(并且数字可以是负数),这将避免if:
int odd = !!(n % 2); // using !! to ensure 0 or 1 value.
a = n + !odd;
b = n + odd;
Run Code Online (Sandbox Code Playgroud)
这与我的第一个代码的逻辑相同,但避免依赖于两个补码.虽然我不知道任何通用处理器不是今天生产的两个补充(甚至已经在过去20年左右生产 - 毫无疑问有人会告诉我,我错了,有些流行的模特仍在制作......).
与性能一样,确保你知道什么是瓶颈,并且如果它实际上是最终在前10位的东西,只会"弄乱"代码.并测量新代码和旧代码以确保新代码实际上是一种改进.
| 归档时间: |
|
| 查看次数: |
655 次 |
| 最近记录: |