進数変換リンク

他の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進数へ変換する


2進数から16進数へ変換する考え方

VBAでは2進数を表現するには文字列を扱います。

2進数から16進数に変換する方法は以下の通りです。

  1. 2進数文字列を右側から4文字ずつ切り出します。
  2. 切り出した4文字を左から順に1文字ずつ2のn乗(3乗、2乗、1乗、0乗の順)を掛けて10進数値に変換します。
  3. 10進数値にした4文字分を合計します。
  4. 合計した10進数値を16進数に変換します。VBAはHex関数があるのでそれを使います。
  5. 4文字ずつ切り出して変換した16進数を全て連結して変換完了です。

例えば、”11010011″であれば、”1101″と”0011″に4文字ずつ切り出し、それぞれを以下のように10進数値に変換して、それを16進数に変換します。10進数から16進数への変換はHex関数を使います。

1つ目の4文字2進数”1101″→”1×2^3 + 1×2^2 + 0×2^1 + 1×2^0″→”1×8 + 1×4 + 0×2 + 1×1″→”8 + 4 + 0 + 1″→10進数”13″ → 16進数”D”

2つ目の4文字2進数”0011″→”0×2^3 + 0×2^2 + 1×2^1 + 1×2^0″→”0×8 + 0×4 + 1×2 + 1×1″→”0 + 0 + 2 + 1″→”3″→10進数”3″ → 16進数”3″

あとは連結して、16進数”D3″となります。

以下のコードはこの考え方を実装しています。


2進数から16進数に変換する関数

第一引数に変換元となる2進数文字列を指定し、第二引数が変換後の16進数文字列が返却されます。

例えば第一引数に”1111″とセットした場合は第二引数に”F”がセットされて関数が終了します。

コメントに大体書いてますが、ちょっと長いコードなので補足します。

コードの18行目から25行目は2進数文字列の文字数が4の倍数になっていなと4文字ずつに分割できないため、4の倍数になるように不足分の”0″を左に付与しています。

例えば、第一引数の2進数文字列が”10111″の5文字だった場合は、”0″を左に3文字付与して”00010111″の8文字にしています。

35行目から39行目は4文字ずつ切り出した2進数文字列(たとえば”0101″)を左から1文字ずつ2のn乗を掛けて演算しています。4回ループし、2^3=8、2^2=4、2^1=2、2^0=1をそれぞれ掛けて4文字分を合計しています。

42行目のIf文は16進数化したときに無用な”0″を左に付けないための措置で、例えば”00000001″を16進数にすると”1″ですがこのIf文がないと”01″になってしまうためそれを回避しています。

ただ、42行目のせいで2進数文字列”0000″を変換した場合、ループ内でsHex変数には値がセットされないため、ループを抜けたあとにsHexが未設定だったら”0″に固定でセットするようにしています。


使い方

2進数文字列をいくつか持つ配列を作って、ループでBinToHex関数を呼び出し、変換結果をイミディエイトウィンドウに出力するサンプルです。

実行結果
1 1
10 2
11 3
100 4
101 5
110 6
111 7
1000 8
1001 9
1010 A
1011 B
1100 C
1101 D
1110 E
1111 F
10000 10
10001 11
10010 12
10011 13
10100 14
10101 15
10110 16
10111 17
11000 18
11001 19
11010 1A
11011 1B
11100 1C
11101 1D
11110 1E
11111 1F
100000 20