哪种位操作方法在C中更有效?

时间:2011-01-07 03:02:10

标签: c bit-manipulation premature-optimization

根据我得到的答案,我认为这个问题毫无意义。感谢您的回复!

我希望得到一个二进制数,其最右边的j位设置为1,其他设置为0.基本上,有两种方法。我想知道哪一个更有效率,还是比这两个更有效?

1. ~(~0 << j)
2. (1 << j) - 1

8 个答案:

答案 0 :(得分:3)

不确定这是否是您正在寻找的答案,但我敢打赌它不会超过一纳秒的差异。 :)

或者,换句话说:除非单行代码是代码中的瓶颈,否则不要对其进行微观优化。

如果您需要其他形式的快速位操作,这些形式可能实际上较慢,请尝试查看编译器内部函数,如_BitScanForward。如果使用得当,那些可能会让您的位操作更快(但在这种情况下)。

答案 1 :(得分:2)

您正在进行微观优化。您的编译器知道这些操作的最佳转换。只要写一个看起来最干净的人眼,继续前进。

答案 2 :(得分:1)

除了已发布的评论:

除了基准测试外,还要检查发出的汇编程序。优化器可能为每个....生成相同的代码。

答案 3 :(得分:1)

这是一个懒惰的答案,但你试过写一个如下的琐碎程序吗?当然它是微观优化,但看看是否有任何差异可能会很有趣也很有趣。

#include <ctime>
main()
{
  int i;
  time_t start = time();
  for (i = 0; i < 1000000; i++)
  {
    // your operation here
  }
  time_t stop = time();
  double elapsed = difftime(stop, start);
}

答案 4 :(得分:1)

如果您真的想要最快,请使用查找表:

const unsigned numbers[] = {
        0x00000000,
        0x00000001, 0x00000003, 0x00000007, 0x0000000f,
        0x0000001f, 0x0000003f, 0x0000007f, 0x000000ff,
        0x000001ff, 0x000003ff, 0x000007ff, 0x00000fff,
        0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff,
        0x0001ffff, 0x0003ffff, 0x0007ffff, 0x000fffff,
        0x001fffff, 0x003fffff, 0x007fffff, 0x00ffffff,
        0x01ffffff, 0x03ffffff, 0x07ffffff, 0x0fffffff,
        0x1fffffff, 0x3fffffff, 0x7fffffff, 0xffffffff};

unsigned h(unsigned j) {
        return numbers[j];
}

将此扩展为64位留给读者练习。正如其他人所说,这一切都不重要。

答案 5 :(得分:1)

除非您将0更改为0U,否则表达式~(~0 << j)具有基于位模式的特定于实现的行为。另一方面,表达式(1 << j) - 1纯粹是算术运算,并且没有位算术,所以它的值在所有实现中都是明确定义的。因此,我总是会使用后者。

答案 6 :(得分:0)

真正的答案可能取决于处理器架构。但是对于所有意图和目的来说,它几乎肯定是无关紧要的。还要考虑您的编译器可以以任何方式输出相同的汇编。如果你真的需要知道它,那么基准它,虽然差异几乎肯定太小而无法衡量(这是你的答案,无所谓)。

答案 7 :(得分:0)

无需定时实验,只需检查生成的机器代码即可。你会发现gcc将它们编译成相同的机器指令。