代码非常简单。
int foo(int a, int b, int c, int d, int e, int f, int g)
{
int r = (1 << a) | (1 << b) | (1 << c) | (1 << d) | (1 << e ) | (1 << f) | (1 << g);
return r;
}
假设所有参数不大于 30。
这似乎是一个非常原始的函数,但是在使用“-Ofast”标志编译后,它仍然需要 28 条指令来计算 r。
是否有替代代码可以使这些按位运算更快?
最佳答案
28 条指令相当快。 考虑一下你在这里做什么。你有:
- 7 轮类操作
- 6 次或手术
- 1次内存分配操作
这已经需要至少 14 条指令。现在有必要的附加指令,例如存储中间结果和将操作数加载到寄存器中。
如果您想进行更深入的分析,请发布程序集输出。
编辑:现在可以优化您的算法。
您可能可以通过牺牲一些内存来获得更快的速度。预先计算以 32 位值设置的每个可能位的值,例如类似这样的东西:int bit2value[32]={1,2,4,8,16,32,64,...};
在您的函数中,您可以替换它们而不是执行移位操作查找预先计算的 map :int r = bit2value[a] |位值[b] | bit2value[c]...;
这样理论上可以省去一些中间存储操作。
关于c - 我怎样才能使这种按位运算更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34027186/