社内SEの話

日々起きたことの記録用

【PowerShell】ビット全探索

Overview

与えられた値の全パターンを使って処理するプログラムの用事がありました。

競技プログラミングでビット全探索という単語を知りました。

競技ではPythonでしたが、実務でPowershellを使う場面が出てきたのでPythonからPowershellに置き換えたプログラムを作りました。

Code

$fruits = @("Apple","Orange","Melon","Lemon")

for($i=0;$i -lt ([Math]::Pow(2,$fruits.Length));$i++){

    $box =@()

    for($j=0;$j -lt $fruits.Length;$j++){

        if($i -band (1 -shl $j)){

            $box += $fruits[$j]

        }

    }

    write-host $box

}

Result

Apple

Orange

Apple Orange

Melon

Apple Melon

Orange Melon

Apple Orange Melon

Lemon

Apple Lemon

Orange Lemon

Apple Orange Lemon

Melon Lemon

Apple Melon Lemon

Orange Melon Lemon

Apple Orange Melon Lemon

description -解説-

Pow

.netのMathクラスを使うことができます。これにより累乗やPI、三角関数を使えるようになります。

example

[Mat]::Pow(2,3)

= 2×2×2 =8

Links

learn.microsoft.com

learn.microsoft.com

-band

10進数で与えられた両辺の値を2進数で計算します。

bandはAND形式なので両辺が1の場合1を返します。

example

10 -band 3

1010 (10)

0011 ( 3)

--------------

0010 ( 2)

learn.microsoft.com

-shl

ビットシフト演算子です。

shlは左辺の値に対して右辺の値(オペランド)の分だけ移動します

example

21 -shl 0 0001 0101 21

21 -shl 1 0010 1010 42

21 -shl 2 0101 0100 84

learn.microsoft.com

Lastly

ぶっちゃけ-bandや -shlはビット全探索以外で使った事が無いです。

もう少し低級言語を補助する時に活用するかも知れませんが、活用の機会はありません。

ビット全探索を使った用事も掃除当番表の作成なので無駄使いといえば無駄遣いかも知れません

Powershellをこんな事に使うのは自分だけかも知れませんが共有します

あと最近海外からのアクセスが多くなってきたので、SEO対策の一環として英語の見出しにしてみました。