警告
コードをもう一度見直してみると、問題なくコンパイルできるかもしれませんが、デッドロックが発生する可能性があると言わざるを得ません。
for (i=1;i<=n;++i)
{
i = (i)&(i-1);
cont++;
}
何が起こるか?いつi
ですか1
:
i = 1&0;//is what line 4 boils down to
したがって、ループが開始された場合、少なくとも 1 になるため、ループ条件は依然として true ですi
。0
n
i<=n => 0 <= n ==> true
Soは( )i
だけインクリメントされ、全体が再び開始されます。4 行目も、次のように評価されます。1
i++
i = 1&0;//assigns 0 again to i
そして、振り出しに戻ります。このプログラムは決して終了せず、同じ操作を何度も繰り返すだけです...
さて、&
ビットごとの AND 演算子です。これを使用すると、2 つの整数を含むスニペットのように、両方の数値で「スイッチがオン」または設定されているビットが返されます。1
簡単に言えば、式は、両方のオペランドで設定された新しいビット セットとして評価されます。たとえば、i
が 2 の場合:
00000010 //2
00000001 // i - 1
--------
00000000
この場合、1
いずれの場合もビットは設定されません。実際、2 のべき乗は 2 進数で次のようになるため、これはすべての 2 のべき乗の事実です。
00000010
00000100
00001000
また、2 から 1 の累乗は次のようになります。
00001000//power of 2
00000111
1
他のすべてのケースでは、両方のケースで設定されているビットが少なくとも 1 つあります。
00000110
00000101
--------
00000100
簡単。
C のビット単位演算子のより完全な概要と詳細な説明については、C のビット単位演算子に関する wiki をいつでも参照できます。