進数変換リンク
他の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進数へ変換する
10進数から2進数へ変換する考え方
10進数から2進数に変換するには、10進数値を2で繰り返し割り、その際の余りの値を連結していき、最終的に割り切れなくなったときの割算結果である商が1の場合は一番左にその値を連結して、2進数に変換します。
なお、VBAでは2進数を表現するには文字列を扱います。
例:10進数文字列”37″を2進数に変換する
37を繰り返し2で割った場合の余りと商は以下になります。
回数 | 1回目 | 2回目 | 3回目 | 4回目 | 5回目 | 6回目 |
---|---|---|---|---|---|---|
2で割った商 | 37 | 18 | 9 | 4 | 2 | 1 |
2で割った余り | 1 | 0 | 1 | 0 | 0 | なし |
これを商、5回目の余り、4回目の余り、3回目の余り、2回目の余り、1回目の余り、の順に連結して、100101となります。
上の表の右側から左に向かって連結していくことになります。
10進数から2進数に変換する関数
第一引数に変換元となる10進数文字列を指定し、第二引数が変換後の2進数文字列が返却されます。
例えば第一引数に”37″とセットした場合は第二引数に”100101″がセットされて関数が終了します。
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 |
'// 引数1 (IN) :10進数文字列 '// 引数2 (OUT) :変換後の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 |
2進数にする際に注意する点としては、2で割った余りを連結する場合に文字列の右ではなく左の上位桁として連結する点です。
文字列の連結は一般的には元の文字列の右につなげることが多いのですが、2進数は左になります。
使い方
10進数文字列をいくつか持つ配列を作って、ループでDecToBin関数を呼び出し、変換結果をイミディエイトウィンドウに出力するサンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub DecToBinTest() 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 DecToBin(a, b) Debug.Print a & " " & b Next End Sub |
実行結果
1 1
2 10
3 11
4 100
5 101
6 110
7 111
10 1010
11 1011
12 1100
13 1101
14 1110
15 1111
16 10000
17 10001
20 10100
21 10101
22 10110
23 10111
24 11000
25 11001
26 11010
27 11011
30 11110
31 11111
32 100000
33 100001
34 100010
35 100011
36 100100
37 100101
40 101000
41 101001
42 101010
43 101011
44 101100
45 101101