0

面接の準備をしていたときに、次のようなものを受け取りました

count=0;
for(i=1;i<=n;i++)
{
    i=(i)&(i-1);    //line 4
    count++;
}
return count;
//--------

i=21,22 same count. For what other values of i we get same count?

4行目が何をしているのか理解できませんでした。誰でも私を助けて、プログラムの出力を教えてください.....

リンクで上記の質問(9)を見つけましたhttp://placement.freshersworld.com/placement-papers/Mentor-Graphics/Placement-Paper-Aptitude-General-32412

4

4 に答える 4

3

i & (i-1) は、i が 2 の累乗の場合、または i が 0 の場合は 0 を返し、それ以外の場合はゼロ以外を返します。

調べると、i は 0 に設定され、count がインクリメントされ、i は再び 1 になり、次に 0 というようになります。

このループが終了するかどうかはわかりません。

于 2013-11-04T06:47:44.543 に答える
3

警告
コードをもう一度見直してみると、問題なくコンパイルできるかもしれませんがデッドロックが発生する可能性があると言わざるを得ません。

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 ですi0n

i<=n => 0 <= n ==> true

Soは( )iだけインクリメントされ、全体が再び開始されます。4 行目も、次のように評価されます。1i++

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 をいつでも参照できます。

于 2013-11-04T06:57:07.323 に答える
1

この線

i = i & (i-1)

の最下位セットビットをクリアしますi。だからループのような

while (i) {
    i = i & (i-1);
    count++; }

に設定されたビット数をカウントしiます。これは実際iには unsigned 型の場合にのみ機能することに注意してください。が符号付きで負の場合i、未定義の動作が発生します。

あなたが提供するリンクは、おそらく、while (i)このようなループについて尋ねる、記憶違いの質問 ( を省略) です。

「i=21,22 同数」というコメントは、21(10101) と 22(10110) の設定ビット数が同じであることのヒントです。

あなたの質問を初めて読んだとき、実際にwhile(i)ループを見たのはi=(i)&(i-1); count++;、その文脈でのみ意味をなす行であり、そのような一般的な「トリックの質問」イディオムであることを認めなければなりません。

于 2013-11-04T06:49:09.507 に答える
0

& はビット単位の AND 演算子です。次のように計算します。

例: i=8

i & (i-1)  is (1000) AND (0111) results 0000.

プログラムを実行すると、無限ループに陥ります。

i=1 and (i) & (i-1) gives 0 

私が1になるたびに

したがって、次のようにコードを変更してください。答えが得られることを願っています。

for(i=1;i<=n;i++)
{
    count=(i)&(i-1);
    printf(" i= %d  count= %d",i,count);
}

結果は次のとおりです。

i= 1 count= 0
i= 2  count= 0
i= 3  count= 2
i= 4  count= 0
i= 5  count= 4
i= 6  count= 4
i= 7  count= 6
i= 8  count= 0
i= 9  count= 8
i= 10  count= 8
i= 11  count= 10
i= 12  count= 8
i= 13  count= 12
i= 14  count= 12
i= 15  count= 14
i= 16  count= 0
i= 17  count= 16
i= 18  count= 16
i= 19  count= 18
i= 20  count= 16
i= 21  count= 20
i= 22  count= 20
i= 23  count= 22
i= 24  count= 16
i= 25  count= 24
于 2013-11-04T07:52:53.247 に答える