C语言中无分支的双精度或集整型



我想写一个函数,当调用它的参数加倍(如果它是非零)或返回一个特定的常数(如果它是零)。如果方便的话,常数总是2的幂。

假设常数是8。当用0调用时,我希望它返回8。当用8调用时,我希望它返回16。等等。

简单的方法是:

unsigned foo(unsigned value)
{
    return (value ? value * 2 : 8);
}

有可能在没有分支的情况下做到这一点吗?

这不会导致额外的内存访问。

int f(int a)
{
    const int c = 8;
    return (a*2)+(a==0)*c;
}
static int myconst[2] = { 8, 0 };
int f(int x)
{
    return x + x + myconst[!!x];
}

主要使用位操作符:

int foo(int n)
{
     const int d = 8;            // default return value for n == 0
     int mask = (n == 0) - 1;    // generate mask = 0 if n == 0, otherwise all 1s
     return ((n << 1) & mask) | (d & ~mask);
}

让我们测试一下:

#include <stdio.h>
static int foo(int n)
{
     const int d = 8;            // default return value for n == 0
     int mask = (n == 0) - 1;    // generate mask = 0 if n == 0, otherwise all 1s
     return ((n << 1) & mask) | (d & ~mask);
}
int main()
{
    const int tests[] = { 8, 1, 0, -1, -8 };
    for (int i = 0; i < sizeof(tests) / sizeof(tests[0]); ++i)
    {
        printf("%4d -> %4dn", tests[i], foo(tests[i]));
    }
    return 0;
}

编译并运行:

$ gcc -Wall double_fun.c && ./a.out
   8 ->   16
   1 ->    2
   0 ->    8
  -1 ->   -2
  -8 ->  -16

相关内容

  • 没有找到相关文章

最新更新