C++ (b&;(1<;i))与(b>;i)&;1)C&x2B+;
通常有必要将数据类型表示为一个位序列,并在循环中获取整个长度的位。虽然我觉得C++ (b&;(1<;i))与(b>;i)&;1)C&x2B+;,c++,performance,bit-manipulation,bit,C++,Performance,Bit Manipulation,Bit,通常有必要将数据类型表示为一个位序列,并在循环中获取整个长度的位。虽然我觉得((b>>I)&1)更直观,但最近我看到一本书使用了(b&(1)哪一个更有利 取决于您需要什么数据 ((b >> i) & 1) gives you a 1 or 0. (b & (1 << i)) gives you a 0 or 2^i. ((b>>i)和1)为您提供1或0。 (b&(1假设您使用它来测试一个位(因此结果的差异是无关的),它取决于上下文、编译器对它做了什么以
((b>>I)&1)
更直观,但最近我看到一本书使用了(b&(1)哪一个更有利
取决于您需要什么数据
((b >> i) & 1) gives you a 1 or 0.
(b & (1 << i)) gives you a 0 or 2^i.
((b>>i)和1)为您提供1或0。
(b&(1假设您使用它来测试一个位(因此结果的差异是无关的),它取决于上下文、编译器对它做了什么以及其他因素
例如,当使用GCC 7.3为现代x86编译时,它们都可以编译为以下序列:
sarx eax, edi, esi
and eax, 1
当使用结果实际做出决策时(而不是将布尔值具体化),代码仍然可以是相同的。显然,如果代码将是相同的,那么效率就不会有差异。Clang喜欢使用bt
和setc
(或者在适当的情况下在cmov或控制流中使用标志),但对这两个代码段也执行相同的操作。MSVC以不同的方式编译代码段,并且可能“更喜欢”1它们执行两个不同的操作。如果b=4
和i=2
,则b&(1>i)&1==1
如果您只是想检查结果是否为非零,以确定是否设置了i
th位,那么只需按照您最直观的方式进行操作。我发现后者更有意义,因为它看起来像是我在检查b
的特定位,而不是在b
上操作。它也可以是泛型的可以一次检查多个位(b&((1b&)(1)谢谢,这是对b进行操作的加点。实际上不需要,只需使用无符号常量1Cool,因此仅当位为0或1且i的值不超过数据类型的位大小时,它们几乎相等。