進数変換リンク
他のn進数からn進数への変換は以下をご参照ください。
VBAで2進数から8進数へ変換する
VBAで2進数から10進数へ変換する
VBAで2進数から16進数へ変換する
VBAで8進数から2進数へ変換する
VBAで8進数から10進数へ変換する
VBAで8進数から16進数に変換する
VBAで10進数から2進数へ変換する
VBAで10進数から8進数へ変換する
VBAで10進数から16進数へ変換する
VBAで16進数から2進数へ変換する
VBAで16進数から8進数へ変換する
VBAで16進数から10進数へ変換する
16進数から2進数へ変換する考え方
16進数から2進数への変換は、一度10進数に変換してからそれを2進数に変換する、二段階に分けて変換する方法を行います。
16進数から10進数への変換は、16進数文字列を「”&H1A”」のように頭に”&H”を付けて、それをVal関数で渡すことで変換できます。
10進数から2進数への変換は「VBAで10進数から2進数へ変換する」で紹介している変換関数の「DecToBin」を利用します。
実は、16進数から直接2進数に変換する方法を検討した際に、10進数へ変換せずに直接変換する方法を検討していました。
その方法は、16進数の0からFに対応する2進数の”0000″から”1111″の対応配列や対応マップを用意して変換する方法で、いくつかコードを書いて試してみたのですが、結局は二段階に分けた方が一番高速でした。
16進数から2進数に変換する関数
以下の関数は、第一引数に変換元となる16進数文字列を指定して実行すると、第二引数に変換後の2進数文字列が設定されます。
例えば第一引数に”1B”とセットした場合は第二引数に”11011″がセットされて関数が終了します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
'// 引数1 (IN) :16進数文字列 '// 引数2 (OUT) :変換後の2進数文字列 Sub HexToBin(a_sHex As String, a_sBin As String) '// 引数の16進数文字列が未設定の場合は処理せずに抜ける If (a_sHex = "") Then Exit Sub End If Dim sBin As String '// 2進数文字列 Dim dDec As Double '// 10進数値 '// 10進数値に変換 dDec = Val("&H" & a_sHex) '// 2進数文字列に変換 call DecToBin(CStr(dDec), sBin) a_sBin = sBin End Sub '// 10進数を2進数に変換 Sub DecToBin(a_sDec As String, a_sBin As String) '// 引数の10進数文字列が未設定の場合は処理せずに抜ける If (a_sDec = "") Then Exit Sub End If Dim i As Integer '// ループカウンタ Dim sBin As String '// 2進数文字列 Dim iRemainder As Integer '// 余り Dim dDiv As Double '// 商 '// 引数10進数文字列を10進数値として取得 dDiv = Val(a_sDec) '// 2進数文字列を初期化 sBin = "" '// 処理完了までループ Do '// 10進数値を2で割った余りを取得 iRemainder = dDiv Mod 2 '// 10進数値を2で割った商を取得(次ループの10進数値になる) dDiv = Int(dDiv / 2) '// 2進数文字列の左に余りを連結 sBin = CStr(iRemainder) & sBin '// 10進数値が2未満(もう2で割れないのでここでループ終了) If (dDiv < 2) Then '// 商が1の場合 If (dDiv = 1) Then '// 2進数文字列の最上位桁の値として"1"を連結 sBin = CStr(dDiv) & sBin End If '// ループを抜ける Exit Do End If Loop '// 引数の2進数文字列を設定 a_sBin = sBin End Sub |
上にも書いていますが、10進数から2進数への変換は「VBAで10進数から2進数へ変換する」で紹介しているコードです。DecToBin()の詳細は紹介ページをご参照ください。
使い方
16進数文字列をいくつか持つ配列を作って、ループでHexToBin関数を呼び出し、変換結果をイミディエイトウィンドウに出力するサンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub HexToBinTest() Dim a As String Dim b As String Dim ar ar = Array("FFf", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "1A", "1B", "1C", "1D", "1E", "1F", "20", "21", "22", "23", "24", "25") Dim i For i = 0 To UBound(ar) a = ar(i) Call HexToBin(a, b) Debug.Print a & " " & b Next End Sub |
実行結果
FFf 111111111111
0 0
1 1
2 10
3 11
4 100
5 101
6 110
7 111
8 1000
9 1001
A 1010
B 1011
C 1100
D 1101
E 1110
F 1111
10 10000
11 10001
12 10010
13 10011
14 10100
15 10101
16 10110
17 10111
18 11000
19 11001
1A 11010
1B 11011
1C 11100
1D 11101
1E 11110
1F 11111
20 100000
21 100001
22 100010
23 100011
24 100100
25 100101