Performance 获取第i位-为%or&;更快?
我想知道以下哪项对于获取整数x的第I个最右边的位(从0开始)更快: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 & (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)