きっかけ
ビット演算の組み込み実現に向け、PowerAutomateで提供されない2進数→10進数をPowerAutomate:子フローの作成 をベースに関数化しました。
ループを回せばシンプルに作れますが処理時間が長くなってしまうので、よく使いそうな条件の場合(入力2進数が16桁以下)はループを使わないよう高速処理してます。
その他の関連関数の実装は以下をご参照ください。
このフローをつくると…
子フローで2進数を指定すると10進数化計算してメインフローに応答します。
引数は PowerAutomate:整数型の最大値を調べてみた ふまえ、50桁未満の2進数まで対応してます。
子フロー全体像
①トリガ設定
親フローからは1個の引数を渡します。
| 名前 | 種類 | パラメータ名 | 必須/非必須 | 備考 |
|---|---|---|---|---|
| 2進数 | 文字列 | text | 必須 | 0と1のみで構成される文字列 |
②変数初期化
『変数を初期化する』で以下1個の変数を設定します。
| 名前 | 種類 | 初期値 |
|---|---|---|
| 返り値 | 整数 | 0 |
| 係数 | 整数 | 0 |
③処理ロジック
入力2進数が16桁までは5)までで処理を終わらせ高速化、それ以上の場合は6)以降のループ処理を行います(処理時間は延びます💦)。

③-1) 入力値=50桁未満の2進数?
『条件』で入力文字列が「0」か「1」の50桁未満となっているか判定をします。
<And条件1>
- 左辺: (式)
length(triggerBody()?['text']) - 条件:次の値以下
- 右辺: (値)50
<And条件2>
- 左辺: (式)
length(replace(replace(triggerBody()?['text'],'0',''),'1','')) - 条件:次の値に等しい
- 右辺: (値)0
③-2) 呼び出し元へ応答(入力エラー)
『PowerApp または Flow に応答する』で返り値をエラーメッセージで設定します。
- 出力の種類:数
- 返り値:エラー:50桁未満の2進数を設定してください
③-3) 終了
『終了』で処理を停止します。
- 状態:失敗
- メッセージ:50桁未満の2進数を設定してください
③-4) 固定長16文字作成
『作成』で入力文字列の右から16桁を切り出した文字列を作成します。(16桁までは高速処理対応するため)
- 入力:
substring( concat('0000000000000000',triggerBody()?['text']), sub(add(16,length(triggerBody()?['text'])),16),16 )
③-5) 返り値設定(16桁以下)
『変数の設定』で返り値に16桁個別計算した値を設定します。
- 値:
@{add(mul(int(substring(outputs('固定長16文字作成'),0,1)),32768), add(mul(int(substring(outputs('固定長16文字作成'),1,1)),16384), add(mul(int(substring(outputs('固定長16文字作成'),2,1)),8192), add(mul(int(substring(outputs('固定長16文字作成'),3,1)),4096), add(mul(int(substring(outputs('固定長16文字作成'),4,1)),2048), add(mul(int(substring(outputs('固定長16文字作成'),5,1)),1024), add(mul(int(substring(outputs('固定長16文字作成'),6,1)),512), add(mul(int(substring(outputs('固定長16文字作成'),7,1)),256), add(mul(int(substring(outputs('固定長16文字作成'),8,1)),128), add(mul(int(substring(outputs('固定長16文字作成'),9,1)),64), add(mul(int(substring(outputs('固定長16文字作成'),10,1)),32), add(mul(int(substring(outputs('固定長16文字作成'),11,1)),16), add(mul(int(substring(outputs('固定長16文字作成'),12,1)),8), add(mul(int(substring(outputs('固定長16文字作成'),13,1)),4), add(mul(int(substring(outputs('固定長16文字作成'),14,1)),2), int(substring(outputs('固定長16文字作成'),15,1)))))))))))))))))}
③-6) 文字列16桁を超える?
『条件』で入力文字列が16桁を超えるか判定をします。
- 左辺: (式)
length(triggerBody()?['text']) - 条件:次の値より大きい
- 右辺: (値)16
③-7) 処理位置配列作成
『作成』で17桁目~末尾までの文字数分の大きさの配列(文字列長-16文字)を作成します。配列に設定する値は17から1ずつインクリメントした値(17,18,…)です。
- 入力:
@{range(17,sub(length(triggerBody()?['text']),16))}
③-8) 係数変数の設定(17ビット)
『変数の設定』で係数に17ビット目が1の場合の10進数値(2の16乗)を設定します。
- 値:65536
③-9) 処理位置配列で繰り返し
『それぞれに適用する』で、③-7にて作成した配列を繰り返し処理します。
- 出力選択: @{outputs('処理位置配列作成')}
③-10) 指定ビット位置が1なら返り値を増やす
『変数の値を増やす』で入力文字列の右から指定位置文字が「1」の場合は返り値に係数変数の値を加算します。(「1」以外は加算しない)
- 値:
@{if(equals(substring(triggerBody()?['text'],sub(length(triggerBody()?['text']),item()),1),'1'),variables('係数'),0)}
③-11) 2倍係数作成
『作成』で係数を2倍にした値を作成します。(仮値作成)
- 入力:
@{mul(variables('係数'),2)}
③-12) 2倍係数の設定
『変数の設定』で係数に「2倍係数作成」を設定します。
- 値:
@{outputs('2倍係数作成')}
④応答設定
『PowerApp または Flow に応答する』で返り値を設定します。
値の種類:数値
名称:返り値
値:@{variables('返り値')}


