質問: C++ 初心者のものです。 AtCoder の解答の中で、以下のようなコードがありました。 ``` if ((i >> id) & 1) { ``` `i` と `id` はそれぞれループのインデックスとベクターの中身です。 この `&` は一体何をしているのでしょうか? ご回答のほどよろしくお願いいたします。
回答: 単にビットごとの論理積です。 ビット演算 - Wikipedia で終わらせてもいいんですがもうちょっと解説。 変数 `i` はおそらく整数型(符号なし数を想定) 変数 `id` は `i` の何ビット目かを指す数値( `0` 以上の値) となっているのでしょう。 `i` として `unsigned char` の 8bit の値を想定します (32bit にすると桁が大きくなりすぎて読みにくくなるため) 仮にその値を 121 (0x79) としましょう。2進数表記すると `01111001` ですね。 さてここで `i>>id` の部分式および `&1` の結果を考えます。 * `id==0` のとき `i>>id` は `01111001` よって `&1` すると `1` * `id==1` のとき `i>>id` は `00111100` よって `&1` すると `0` * `id==2` のとき `i>>id` は `00011110` よって `&1` すると `0` * `id==3` のとき `i>>id` は `00001111` よって `&1` すると `1` なんとなく法則が見えてきましたか? `i` の値を2進数表記したとき `id` 桁目の値(は `0` か `1` しかありえないわけですが)を取り出している式となっています。 あとついでに [c](/questions/tagged/c "'c' のタグが付いた質問を表示") / [c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示") の `if` のカッコの中には比較式がなくてもよいことに注目。カッコの中が `0` `false` だと `else` 側が処理されます。 `0` 以外なら `1` でも `-7` でも `42` でもなんでも `then` 側が処理されます。まあこの例題では `0` か `1` が得られるわけですが、比較式は要らないのです。。