目的
グレイコードで計数されているデータが有って、単純に Bin2Dec じゃ当然ダメ。
特殊な為にな処理が必要だけど今どき流行らない?のか情報も少なめなんで、Power Query の実装例を残しておこう、と。
Dec2Grayは必要なかったんで用意してません。欲しい場合はご相談を。
グレイコードとは
組込み系で使う特殊な二進化表現です。
詳しくは Wiki をどうぞ
実装例
GrayCode2Bin
(Bin0, Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7) =>
let
// Bit(1 or 0) 故、最初にText化&結合。Text("01010101")の場合は、GrayCodeにそのまま入れればOK
GrayCode = Text.Combine({ Text.From(Bin0), Text.From(Bin1) , Text.From(Bin2) , Text.From(Bin3) , Text.From(Bin4) , Text.From(Bin5) , Text.From(Bin6) , Text.From(Bin7)}),
GrayCodes = Text.ToList(GrayCode),
BinaryCodes = List.Generate(
() => [ index = 0, grayBool = GrayCodes{0} = "1", gray = Number.FromText(GrayCodes{0})], // initial
each [index] < List.Count(GrayCodes), // condition
each [
index = [index] + 1,
grayBool = (GrayCodes{index} = "1" or [grayBool]) and (not ((GrayCodes{index} = "1") and ([grayBool]))),
gray = if grayBool then 1 else 0 // Number.Power で数値利用するので、数値としておく
],
each [gray] // next
),
dimension = List.Count(BinaryCodes) - 1,
Decimals = List.Sum(
List.Transform(
{0 .. dimension},
each BinaryCodes{_} * Number.Power(2, dimension - _)
)
)
in
Decimals
あとがき
- Bitデータの入力だったので、そのまま渡すようにしたけど、結合させてからの方が関数呼び出しの際に楽だったかも・・
- Endian に疑問があったので、後で直しやすいようにって思ったんだけど、どっちもどっちだった気がしてます・・🙄