Performance 获取第i位-为%or&;更快?

Performance 获取第i位-为%or&;更快?,performance,math,assembly,bit-manipulation,bit,Performance,Math,Assembly,Bit Manipulation,Bit,我想知道以下哪项对于获取整数x的第I个最右边的位(从0开始)更快: x & (1 << i) x >> i % 2 x&(1>i%2 也很好奇为什么一个人跑得更快 谢谢!注意 正如评论所说,这取决于许多因素。而且,你不应该在意。在任何真实的程序中,我不相信你会关心如此低级的细节。过早优化是一种可怕的时间浪费 此外,这些不是相等操作,除非相等的概念只是零/非零的概念 但这是一项有趣的运动 将GCC与-O3一起使用,我看到: x & (1 <<

我想知道以下哪项对于获取整数x的第I个最右边的位(从0开始)更快:

x & (1 << i)
x >> i % 2
x&(1>i%2
也很好奇为什么一个人跑得更快

谢谢!

注意

正如评论所说,这取决于许多因素。而且,你不应该在意。在任何真实的程序中,我不相信你会关心如此低级的细节。过早优化是一种可怕的时间浪费

此外,这些不是相等操作,除非相等的概念只是零/非零的概念

但这是一项有趣的运动

将GCC与-O3一起使用,我看到:

x & (1 << i)

The first version
Dump of assembler code for function op1:
   0x0000000000000000 <+0>:     mov    %esi,%ecx
   0x0000000000000002 <+2>:     mov    $0x1,%eax
   0x0000000000000007 <+7>:     shl    %cl,%eax
   0x0000000000000009 <+9>:     and    %edi,%eax
   0x000000000000000b <+11>:    retq   
End of assembler dump.

好吧,说穿了-完全一样。现代超级定标器处理器中有足够的硬件来隐藏任何差异。

提取位的惯用方法是

(x >> i) & 1
也可以类似地工作超过一位,或者

x & (1 << i)

x&(1它取决于平台、编译器和优化标志。@OliCharlesworth。在愚蠢的实现中,第一个可能会更快,因为
&
是(可能的)比
%
快,移位是一次清洗,向左或向右。但在某些处理器上
&
%
同样快,更重要的是,除了最笨的编译器外,所有编译器都会将
%2
转换为掩码操作。注意:这两种操作非常不同。您可能是指
(x>>i)%2
,如前所述,它相当于
x>(i%2)
。第二种方法很愚蠢-你在使用位,所以使用位。不要把它隐藏在看似正常的算术后面。编译器会生成不同的输出,因为如果
x
是有符号和负数,表达式的行为会有所不同。正如我注意到的,即使对于无符号值,它们的行为也会有所不同,除非你所做的只是testing
==0
1&(x>>>i)
这同样有效。
(x >> i) & 1
x & (1 << i)