👌

bit全探索のテンプレート文の内容をメモ

2024/07/04に公開

記事を書く目的

bit全探索のテンプレート文にbit演算が多用されており、日を空けると忘れて調べ直しが続いているのでそれを無くしたい。

bit全探索テンプレート

for (int bit = 0; bit < (1 << n); bit++) // 1.
    {
        for (int i = 0; i < n; i++) // 2.
        {
            if (bit & (1 << i)) { // 3.
                
            }
        }
        
    }

1行ごとに内容説明

前提としてnが3の時とする

for (int bit = 0; bit < (1 << n); bit++) // 1.

c++だと2**nが使えない+pow関数は誤差の問題があるので、bitシフトを使った書き方にせざるを得ない。
1 << 3 = 1000 = 8だから、0(000)から7(111)までループを回す

for (int i = 0; i < n; i++) // 2.

nが3だから0から2までループを回す

if (bit & (1 << i)) // 3.

bitが0(000)でiが2の時、1 << 2 = 100,000 & 100 = 000でfalseになる
bitが3(011)でiが2の時、011 & 100 = 000でfalseになる。
bitが7(111)でiが2の時、111 & 100は100でtrueになる。

Discussion