LoginSignup
0
0

More than 1 year has passed since last update.

Power BI/Query で グレイコードを数値に変換

Posted at

目的

グレイコードで計数されているデータが有って、単純に Bin2Dec じゃ当然ダメ。
特殊な為にな処理が必要だけど今どき流行らない?のか情報も少なめなんで、Power Query の実装例を残しておこう、と。

Dec2Grayは必要なかったんで用意してません。欲しい場合はご相談を。

グレイコードとは

組込み系で使う特殊な二進化表現です。
詳しくは Wiki をどうぞ

実装例

2021-08-18_17h01_11.png

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 に疑問があったので、後で直しやすいようにって思ったんだけど、どっちもどっちだった気がしてます・・🙄
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0