0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PowerAutomate子フロー:10進数→2進数変換

0
Posted at

きっかけ

ビット演算の組み込み実現に向け、PowerAutomateで提供されない10進数→2進数をPowerAutomate:子フローの作成 をベースに関数化しました。
ループを回せばシンプルに作れますが処理時間が長くなってしまうので、よく使いそうな条件の場合(返り値2進数が16桁未満)はループを使わないよう高速処理してます。

その他の関連関数の実装は以下をご参照ください。

このフローをつくると…

子フローで10進数を指定すると2進数化を計算してメインフローに応答します。
引数は PowerAutomate:整数型の最大値を調べてみた ふまえ15桁まで対応してます。

<親フローの実装例>

<親フローの処理結果>

子フロー全体像

構成は以下の通りです。

①トリガ設定

親フローからは1個の引数を渡します。

名前 種類 パラメータ名 必須/非必須 備考
入力値 数値 number 必須

②変数初期化

『変数を初期化する』で以下1個の変数を設定します。

名前 種類 初期値
返り値 文字列 @{null}

③処理ロジック


③-1) 入力値は16桁未満の整数?

『条件』で入力値が処理上限値の範囲化をチェックします。

<And条件1>

  • 左辺: (式)isInt(string(triggerBody()['number']))
  • 条件:次の値に等しい
  • 右辺: (式)true

<And条件2>

  • 左辺: (式)int(string(triggerBody()?['number']))
  • 条件:次の値以上
  • 右辺: (値)0

<And条件3>

  • 左辺: (式)length(triggerBody()?['number'])
  • 条件:次の値未満
  • 右辺: (値)16

③-2) エラー応答を返す(入力エラー)

『PowerApp または Flow に応答する』で返り値をエラーメッセージで設定します。

  • 出力の種類:テキスト
  • 返り値:エラー:16桁未満の整数を設定してください

③-3)終了(入力エラー)

『終了』で処理を停止します。

  • 状態:失敗
  • メッセージ:16桁未満の整数を設定してください

③-4) 16進数文字列作成

『作成』で入力値を16進数文字列に変換します。

  • 入力:formatNumber(int(triggerBody()?['number']),'x')

③-5) 16進数配列選択

『選択』で、開始では「③-4) 16進数文字列作成」の文字数分の配列に0から連番を振った値を設定した配列を設定、マップでは「③-4) 16進数文字列作成」の返り値を左から1文字ずつ切り出した文字を設定します。

  • 開始:@{range(0,length(outputs('16進数文字列作成')))}
  • マップ:(式)substring(outputs('16進数文字列作成'),item(),1)

③-6) 4ビット2進数配列選択

『選択』で、開始では「③-5) 16進数配列選択」を設定、マップでは切り出した16進数文字を4ビット2進数(0→0000、1→0001、…、f→1111)に変換した文字列を設定します。

  • 開始:@{body('16進数配列選択')}
  • マップ:(式)if(equals(item(),'0'),'0000',if(equals(item(),'1'),'0001',if(equals(item(),'2'),'0010',if(equals(item(),'3'),'0011',if(equals(item(),'4'),'0100',if(equals(item(),'5'),'0101',if(equals(item(),'6'),'0110',if(equals(item(),'7'),'0111',if(equals(item(),'8'),'1000',if(equals(item(),'9'),'1001',if(equals(item(),'a'),'1010',if(equals(item(),'b'),'1011',if(equals(item(),'c'),'1100',if(equals(item(),'d'),'1101',if(equals(item(),'e'),'1110','1111')))))))))))))))

③-7) 返り値に生成2進数配列を文字化設定

『変数の設定』で作成した2進数文字列配列を結合して返り値に設定します。

  • 値:@{join(body('4ビット2進数配列選択'),'')}

③-8) 先頭文字=0?

『条件』で返り値の先頭文字が「0」かチェックします。

  • 左辺: (式)substring(variables('返り値'), 0, 1)
  • 条件:次の値に等しい
  • 右辺: (値)0

③-9) 16桁未満?

『条件』で返り値の桁数が16桁未満かチェックします。

  • 左辺: (式)length(variables('返り値'))
  • 条件:次の値未満
  • 右辺: (値)16

PowerAutomate:整数型の最大値を調べてみた をふまえ、16桁以上の整数は正しくない可能性があるので、16桁未満の場合のみint化→string再変換で前方0除去することでループ処理を避ける分岐としてます。


③-10) 先頭0除去した返り値作成

『作成』で返り値変数の先頭1文字を除去した文字列を作成します。

  • 入力:@{substring(variables('返り値'),1)}

③-11) 返り値変数を入替設定(1)

『変数の設定』で「③-10) 先頭0除去した返り値作成」を返り値に設定します。

  • 値:@{outputs('先頭0除去した返り値作成')}

③-12) 先頭文字が1になるまで繰り返し

『Do Until』で先頭文字が「1」になるまで繰り返します。

  • 左辺: (式)substring(variables('返り値'), 0, 1)
  • 条件:次の値に等しい
  • 右辺: (式)1

「③-6) 4ビット2進数配列選択」をふまえ、先頭0は最大3つしか発生しないため、ループ回数も最大3回となります。


③-13) 2進数文字列の先頭1文字除去

『作成』で返り値変数の先頭1文字を除去した文字列を作成します。

  • 入力:@{string(int(variables('返り値')))}

③-14) 返り値変数を入替設定(2)

『変数の設定』で「③-13) 2進数文字列の先頭1文字除去」を返り値に設定します。

  • 値:@{outputs('2進数文字列の先頭1文字除去')}

④応答設定

『PowerApp または Flow に応答する』で応答値を設定します。

  • 出力の種類:テキスト
  • 名称:返り値
  • 値:@variables('返り値')
0
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?