あいまいまいんの生物学

あいまいまいんの生物学

生物学が好き。勉強したり遊んだり。

日頃感じたこと思ったこと、出来事など

勉強して面白かった話

授業で使えそうな生物学の知識・雑談・小ネタ

などなどを紹介していきたいと思います

コメント大歓迎!気軽にコメントして下さい

ゲームサイトはこちら

プログラミング bit全探索の勉強とその他

今日は全校出校日で、私も久々の出勤でした。

お盆明けの出勤はやはり疲れるものがあります。

何といって取り立ててやってもないし、

授業もしていないのだけれど…。


さて、今日はbit全探索の勉強をしました。

この記事を参考に勉強。

https://qiita.com/drken/items/7c6ff2aa4d8fce1c9361

取り敢えずbitとはなにか、というところで

整数を二進法で表したときに1と0の並びになる…その時何番目に1があるか、というその番号の集合がbitらしい?

そしてbit演算とは、

AND & の場合(左2つを照らし合わせて右列が出力)
 0    0    0
 0    1    0
 1    0    0
 1    1    1

OR | の場合
 0    0    0
 0    1    1
 1    0    1
 1    1    1
と、二進法で表された数字同士を各桁で照らし合わせ、演算するものを指すそうです。

 

そして、ビットシフト演算子なるものがあり、

bit に i 番目のフラグが立っているかどうかは if ((bit>>i) & 1) と表記します。

やっと本題。

bit 全探索とは、n個の要素からなる集合 {0,1,…,n−1} の部分集合をすべて調べ上げる手法のことです。

for (int bit = 0; bit < (1<<n); ++bit){ bitで表される集合の処理 }

という形で実施することができます。

これは、「右からn番目に1というフラグが立っている状態の手前までbitという整数を0から始めて列挙せよ」という意味(で合ってるのかな…?)なので

n番目に1、つまり100000000…000(n個分の0)の一個手前、よって

11111111…1111(n個分の1)まで全て列挙していくことを指示しています。

だから、例えばn=3なら

1000まで、

0000 {}

0001 {0}

0010 {1}

0011 {0,1}

0100 {2}

0101 {0,2}

0110 {1,2}

0111 {0,1,2}

という風に全ての状態を洗い出すことができる!

これがbit全探索なんですね。

ということでこの問題を解きました。

ABC 079 C

これはもう優秀な人のソースコードを見て真似して書いてみて、理解することの方に尽力しようとしたのですが

sumにどうして毎回-'0'が付くのか分からない…。

ここは理解できるように課題だなぁ。

取り敢えず実装してみて慣れるのみ、という感じがします。

 

明日から2日間また遠くでお仕事です。

頑張らなきゃ…