我想写一个函数,当调用它的参数加倍(如果它是非零)或返回一个特定的常数(如果它是零)。如果方便的话,常数总是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