c - 我怎样才能使这种按位运算更快?

标签 c optimization bitwise-operators

代码非常简单。

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/

相关文章:

optimization - 帮助优化 matlab 中的 for 循环

optimization - 使用-fast编译时,波特兰组FORTRAN pgf90程序失败,-fast -Mnounroll成功时,

python - Python 中的位运算

c - numpy/arrayobject.h 和 C 扩展

c++ - 如何优化指针间接层

C - 将未初始化的变量传递给数组元素

c - c中printf命令的顺序

algorithm - 如何检查2个数字是否具有相同的位数和长度?

c - 当按位与应用于负数时会发生什么?

mysql - SQL按位运算(MySql)