問題解決のための「アルゴリズム×数学」で変換方法を知った
この計算方法を使えば10進数からあらゆる進数に変換できるようだ。 おもしろそうなのでユーザー定義関数で再現してみることにした。
進数変換アルゴリズム
10進数から他の進数への変換は下記のように行う。
- 10進数の値を変換したい進数で割り算を行う
- 商を更に変換したい進数で割り算を行う
- 商がゼロになるまで繰り返す
- 商がゼロになったら計算終了
- 算出された「余り」を下から順番に並べる
- 出来上がった数値が求めたい進数に変換した数値
この手順で10進数から2進数などの他の進数への変換ができます。
実際に10進数の「20」を2進数に変換してみます。
10進数の値を変換したい進数で割り算を行う
商がゼロになるまで繰り返す
算出された「余り」を下から順番に並べる
出来上がった数値が求めたい進数に変換した数値。 10進数の「20」を2進数に変換した結果「10100」なりました。
進数変換自作関数
上記の進数変換アルゴリズムを再現した関数が以下です。
Function kfTo○進数(何進数 As Long, 数値 As Long, Optional 表示整形有無 As Boolean = False) As Variant Dim 解 As Long Dim 余 As Collection: Set 余 = New Collection 解 = 数値 Do 余.Add 解 Mod 何進数 解 = 解 \ 何進数 Loop Until 解 = 0 Dim i As Long Dim ans As Variant For i = 余.Count To 1 Step -1 ans = ans & kf10以上の数値をアルファベットに変換(余(i)) Next If 表示整形有無 Then ans = kf進数整形(何進数, ans) If 何進数 = 10 Then ans = Val(ans) kfTo○進数 = ans End Function --- Private Function kf10以上の数値をアルファベットに変換(数値 As Long) As String Dim ans As Variant: ans = 数値 If 数値 >= 10 Then ans = Mid("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 数値 - 9, 1) kf10以上の数値をアルファベットに変換 = ans End Function --- Private Function kf進数整形(何進数 As Long, 値 As Variant) As String Dim ans As String Select Case 何進数 Case 2 Dim 桁 As Long: 桁 = WorksheetFunction.Ceiling(Len(値), 8) ans = Right(String(桁, "0") & 値, 桁) Case 10 ans = Val(値) Case 16 ans = "0x" & 値 Case Else ans = 値 & "(" & 何進数 & ")" End Select kf進数整形 = ans End Function
まとめ
Excelに用意されているDEC2BIN関数などは変換できる範囲が狭いのでこの関数であれば、10進数からあらゆる進数に変換でき、もっと大きな数値でも変換可能だとほくそ笑んでおりました。
が…
base関数|•ω•`)チラッ
— かづき (@kadukijob) 2022年1月9日
なんだと…
BASE関数なんてものが存在しているのか!
今回作った関数のメリットが標準関数に全て含まれている!
…
良いんだ。
進数変換のロジックを理解することが出来たし。
自作関数で作っておけば細かい融通を利かすことも出来るしね。
良いんだ…