ひっそりとExcel関数のおさらい(二進化十進数の相互変換)
今回は自作関数です。前回、基数変換について書きましたが、そういえば二進化十進数を相互変換する関数ってないんだなーと思い、作ってみました。無くても困りませんが、遊びで作ってみました。
目次
そもそも二進化十進数って?
二進化十進数は、BCD(Binary Coded Decimal)とも呼ばれ、10進数の1桁を2進数の4桁で表現するというものです。
1 | 0001 |
2 | 0010 |
3 | 0011 |
4 | 0100 |
5 | 0101 |
6 | 0110 |
7 | 0111 |
8 | 1000 |
9 | 1001 |
10 | 00010000 |
11 | 00010001 |
12 | 00010010 |
13 | 00010011 |
14 | 00010100 |
15 | 00010101 |
16 | 00010110 |
17 | 00010111 |
18 | 00011000 |
19 | 00011001 |
左側がBCDでの10進数表現、右側が2進数表現です。
9までいくと桁上がりし、2進数の4桁が増えていくといった具合です。16進数でいうところのA,B,C,D,E,Fに該当する、1010,1011,1100,1101,1110,1111は、BCDでは使用しません。
桁を合わせた際に、2進数表現、16進数表現だった場合、どちらも非エンジニアの人には馴染みが薄いということで、事業用の設備なんかでBCDを採用しているケースがあります。(そもそも、馴染みのない人が設備の内部データに触れることがあるのか疑問ですが・・・)
BCD表現における10進数を2進数に変換する
=BCD2BIN(10進数)
例えば、10進数の「15」を普通に2進数変換すると「1111」ですが、これをBCD表現である「00010101」に変換します。
下記のコードをアドイン用ブックに追記するか、個人用マクロブックに追記することで、関数が使用できるようになります。
Function BCD2BIN(Bcd As String) As String '引数に10進数を指定します 'BCD表現における10進数を2進数に変換します Dim BcdL As Integer Dim i As Integer BcdL = Len(Bcd) For i = 1 To BcdL BCD2BIN = BCD2BIN & WorksheetFunction.Hex2Bin(Mid(Bcd, i, 1), 4) Next i End Function
BCD表現における2進数を10進数に変換する
=BIN2BCD(2進数)
例えば、2進数の「00010101」を普通に10進数変換すると「21」ですが、これをBCD表現である「15」に変換します。
下記のコードをアドイン用ブックに追記するか、個人用マクロブックに追記することで、関数が使用できるようになります。
Function BIN2BCD(Bin As String) As String '引数に2進数を指定します 'BCD表現における2進数を10進数に変換する Dim BinL As Integer Dim i As Integer Bin = "000" & Bin BinL = Len(Bin) For i = 3 To BinL - 1 Step 4 If 9 >= WorksheetFunction.Bin2Dec(Mid(Bin, BinL - i, 4)) Then BIN2BCD = WorksheetFunction.Bin2Dec(Mid(Bin, BinL - i, 4)) & BIN2BCD Else '9を超える場合はエラー表示し、プログラムを終了する BIN2BCD = "Error" Exit Function End If Next i End Function