進数変換リンク

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

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

8進数から2進数に変換するには、8進数値の各桁が2進数では000から111の範囲にあることを利用します。

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

まず、8進数文字列を1文字ずつ数値として8進数値を取得し、4で割った値を取得します。これが2進数の一番左の値になります。次に、8進数値から先ほど取得した4で割った値と4を掛けた値を引き、それを2で割ります。これが2進数の真ん中の値になります。次に、8進数値から(4で割った値×4)と(2で割った値×2)を引き、残りの値を取得します。これが2進数の一番右の値になります。

これらの連結して2進数文字列になります。あとは各8進数文字列を1文字ずつ繰り返して2進数文字列を連結させることで変換は完了です。

例:8進数文字列”37″を2進数に変換する
右側から1文字ずつ取得すると「”3″、”7″」になります。これを1文字ずつ2進数に変換します。

“3” → 2進数の一番左=3÷4→0、2進数の真ん中=(3 – (0 * 4)) / 2→1、2進数の一番右=(3 – (0 * 4) – (1 * 2))→1 →連結すると“011”
“7” → 2進数の一番左=7÷4→1、2進数の真ん中=(7 – (1 * 4)) / 2→1、2進数の一番右=(7 – (1 * 4) – (1 * 2))→1 →連結すると“111”
“011”と”111″を連結させて”011111″になり、通常は先頭から連続する”0″は省略するため、”11111″になります。

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

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

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

コードは8進数から2進数への変換の考え方をそのまま書いているのでコメントの内容で処理は理解できると思います。

分かりにくい点とすれば、2進数文字列の先頭”0″を付けないようにするために、8進数文字列のループ内で初回の2進数文字の”0″は戻り値用の2進数文字列には連結しないようにIf文で判定処理を入れているところぐらいです。

ただその処理を入れているせいで、8進数文字列が”0″の場合にループ内では2進数文字列が””となってしまうため、その補完を行うためにループ終了後に”0″にする処理を入れています。

使い方

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

実行結果
1 1
2 10
3 11
4 100
5 101
6 110
7 111
10 1000
11 1001
12 1010
13 1011
14 1100
15 1101
16 1110
17 1111
20 10000
21 10001
22 10010
23 10011
24 10100
25 10101
26 10110
27 10111
30 11000
31 11001
32 11010
33 11011
34 11100
35 11101
36 11110
37 11111
40 100000
41 100001
42 100010
43 100011
44 100100
45 100101