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
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
-band
10進数で与えられた両辺の値を2進数で計算します。
bandはAND形式なので両辺が1の場合1を返します。
example
10 -band 3
1010 (10)
0011 ( 3)
--------------
0010 ( 2)
links
-shl
ビットシフト演算子です。
shlは左辺の値に対して右辺の値(オペランド)の分だけ移動します
example
21 -shl 0 0001 0101 21
21 -shl 1 0010 1010 42
21 -shl 2 0101 0100 84
links
Lastly
ぶっちゃけ-bandや -shlはビット全探索以外で使った事が無いです。
もう少し低級言語を補助する時に活用するかも知れませんが、活用の機会はありません。
ビット全探索を使った用事も掃除当番表の作成なので無駄使いといえば無駄遣いかも知れません
Powershellをこんな事に使うのは自分だけかも知れませんが共有します
あと最近海外からのアクセスが多くなってきたので、SEO対策の一環として英語の見出しにしてみました。