有效地检查整数的均匀性/奇数

Bil*_*ean 1 c++ conditional function

我有一个数学函数,它依赖于三个变量{n,a和b}

当n是偶数时,{a = n + 1,b = n}

当n为奇数时,{b = n + 1,a = n}

我的函数被调用很多次,各种N-.有没有一种有效的方法来实现它?我认为从长远来看a switchif声明可能效率不高.

编辑:这是一个最小的例子:

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)

Mat*_*son 5

只要使用的数字系统是二进制补码(即-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位的东西,只会"弄乱"代码.并测量新代码和旧代码以确保新代码实际上是一种改进.

  • 当然,如果这个优化是有效的,任何有价值的编译器都会将`n%2`优化为`n&1`. (3认同)