根据我得到的答案,我认为这个问题毫无意义。感谢您的回复!
我希望得到一个二进制数,其最右边的j位设置为1,其他设置为0.基本上,有两种方法。我想知道哪一个更有效率,还是比这两个更有效?
1. ~(~0 << j)
2. (1 << j) - 1
答案 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将它们编译成相同的机器指令。