Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ (b&;(1<;i))与(b>;i)&;1)C&x2B+;_C++_Performance_Bit Manipulation_Bit - Fatal编程技术网

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&((1
b&)(1)谢谢,这是对b进行操作的加点。实际上不需要,只需使用无符号常量1Cool,因此仅当位为0或1且i的值不超过数据类型的位大小时,它们几乎相等。