55471


C++ 初心者のものです。

AtCoder の解答の中で、以下のようなコードがありました。

[code]

    if ((i >> id) & 1) {
    
[/code]

`i` と `id` はそれぞれループのインデックスとベクターの中身です。  
この `&` は一体何をしているのでしょうか？

ご回答のほどよろしくお願いいたします。


CC BY-SA 4.0
2019-06-03T03:16:34.440
55468
2019-06-04T11:58:47.427
2019-06-04T11:58:47.427
3060
31609
question
c++
条件式 if (( i >> id) & 1) の意味について


単にビットごとの論理積です。  
[ビット演算 -
Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%93%E3%83%83%E3%83%88%E6%BC%94%E7%AE%97)  
で終わらせてもいいんですがもうちょっと解説。

変数 `i` はおそらく整数型（符号なし数を想定）  
変数 `id` は `i` の何ビット目かを指す数値（ `0` 以上の値）  
となっているのでしょう。

`i` として `unsigned char` の 8bit の値を想定します (32bit にすると桁が大きくなりすぎて読みにくくなるため) 仮にその値を
121 (0x79) としましょう。２進数表記すると `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` の値を２進数表記したとき `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`
が得られるわけですが、比較式は要らないのです。。


CC BY-SA 4.0
2019-06-03T04:18:37.417
55471
2019-06-03T10:10:36.513
2019-06-03T10:10:36.513
8589
8589
55468
answer