繁体   English   中英

(B&(1 &lt; <i)) VS ((b > &gt; i)和1)C ++

[英](b&(1<<i)) VS ((b >> i) & 1) C++

通常有必要将数据类型表示为一系列位,并在整个长度的循环内读取它们。 尽管我发现((b >> i) & 1)更直观,但是最近我看到了一本书的使用(b&(1<<i)) 它们中的任何一个是更有利还是更有效?如果其中之一是,为什么?

假设您使用此工具进行测试(因此结果的差异无关紧要),则取决于上下文,编译器对其进行的操作以及其他因素。

例如,当使用GCC 7.3针对现代x86进行编译时,它们完全相同 ,两者都可以编译为以下顺序:

sarx eax, edi, esi
and eax, 1

而且,当使用结果实际做出决定(而不是实现布尔值)时,代码仍然可以相同。 显然,如果代码将相同,则效率不会有差异。 Clang喜欢使用btsetc (或者在适当的时候在cmov或控制流中使用该标志),但是对两个代码片段也做同样的事情。 MSVC确实以不同的方式来编译代码片段,并且在某种意义上也许“更喜欢” 1 << i公式。

从字面上实现b & (1 << i) (我没有观察到任何编译器实际上执行过)需要一条额外的指令将常量1加载到寄存器中,尽管这并不一定意味着会花费额外的时间(尽管可以) :创建1独立于其他所有东西,因此它可能比其他所有东西先执行,然后移位独立于b因此它可以在i准备好之后但在b之前执行。

哪个更有利?

取决于您需要什么数据。

((b >> i) & 1) gives you a 1 or 0.

(b & (1 << i)) gives you a 0 or 2^i.

哪个更有效?

它们之间的效率差异可以忽略不计。 另外,区别在于不同的体系结构和编译的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM