進数変換リンク
他の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″がセットされて関数が終了します。
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 |
'// 引数1 (IN) :8進数文字列 '// 引数2 (OUT) :変換後の2進数文字列 Sub OctToBin(a_sOct As String, a_sBin As String) Dim iLen As Integer '// 8進数文字列 Dim i As Integer '// ループカウンタ Dim sBin As String '// 2進数文字列 Dim iOct As Integer '// 8進数値 Dim iBin1 As Integer '// 2進数文字列の1文字目の数値 Dim iBin2 As Integer '// 2進数文字列の2文字目の数値 Dim iBin3 As Integer '// 2進数文字列の3文字目の数値 '// 引数8進数文字列が未設定の場合は処理を抜ける If (a_sOct = "") Then Exit Sub End If '// 8進数文字列長を取得 iLen = Len(a_sOct) '// 8進数文字列を1文字ずつループ For i = 1 To iLen '// 8進数文字列の1文字を数値で取得 iOct = CInt(Mid(a_sOct, i, 1)) '// 8進数値を2進数値に変換 iBin1 = Int(iOct / 4) '// 4で割った値 iBin2 = Int((iOct - (iBin1 * 4)) / 2) '// 8進数値から4で割った値を引いてから2で割った値 iBin3 = Int((iOct - (iBin1 * 4) - (iBin2 * 2))) '// 残りの値 '// 2進数文字列の1文字を連結済みまたは0以外の場合(最初から0が連続している場合は連結しない) If (sBin <> "" Or iBin1 <> 0) Then sBin = sBin & CStr(iBin1) End If '// 2進数文字列の2文字を連結済みまたは0以外の場合(最初から0が連続している場合は連結しない) If (sBin <> "" Or iBin2 <> 0) Then sBin = sBin & CStr(iBin2) End If '// 2進数文字列の3文字を連結済みまたは0以外の場合(最初から0が連続している場合は連結しない) If (sBin <> "" Or iBin3 <> 0) Then sBin = sBin & CStr(iBin3) End If Next '// ループ処理で8進数文字列が連結されなかった場合(ALL"0"の場合) If (sBin = "") Then sBin = "0" End If a_sBin = sBin End Sub |
コードは8進数から2進数への変換の考え方をそのまま書いているのでコメントの内容で処理は理解できると思います。
分かりにくい点とすれば、2進数文字列の先頭”0″を付けないようにするために、8進数文字列のループ内で初回の2進数文字の”0″は戻り値用の2進数文字列には連結しないようにIf文で判定処理を入れているところぐらいです。
ただその処理を入れているせいで、8進数文字列が”0″の場合にループ内では2進数文字列が””となってしまうため、その補完を行うためにループ終了後に”0″にする処理を入れています。
使い方
8進数文字列をいくつか持つ配列を作って、ループでOctToBin関数を呼び出し、変換結果をイミディエイトウィンドウに出力するサンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub OctToBinTest() Dim a As String Dim b As String Dim ar ar = Array("1", "2", "3", "4", "5", "6", "7", "10", "11", "12", "13", "14", "15", "16", "17", "20", "21", "22", "23", "24", "25", "26", "27", "30", "31", "32", "33", "34", "35", "36", "37", "40", "41", "42", "43", "44", "45") Dim i For i = 0 To UBound(ar) a = ar(i) Call OctToBin(a, b) Debug.Print a & " " & b Next End Sub |
実行結果
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