使う人がどれだけいるんだ(笑)というような関数。
いや、今回はこっちでは多用する気配なんで共通関数化。
VB4な脳でロジック駆使した結果、やはりどこかVB4ちっく(笑)
ABCDEFGという要素の配列があってAとCとGだけ使いたいって時には、DBの列:bAlphには69と保存される仕様があると思って。
つまり、bAlph = 69 とすると「A-C-G」という文字列にしなくちゃなんない。
で、文字列を返す、関数(^^;
'ビット数値と配列から、ビットONとなっている相対配列の文字列を連結して返す
Protected Function BitToItem(ByVal oBit As Object, ByVal aLabels() As String, ByVal sJoinStr As String) As String
'ビットを01の2進数配列にセット
Dim wArray() As Char = Convert.ToString(CType("0" & oBit.ToString, Integer), 2).ToCharArray
Array.Reverse(wArray)
'リターンワークの準備
Dim retStr As String = ""
'ビットONにあわせて、配列の値を連結
For i As Integer = LBound(wArray) To UBound(wArray)
If wArray(i) = "1" Then
retStr += aLabels(i) & vbCr
End If
Next
Return retStr.TrimEnd(CChar(vbCr)).Replace(vbCr, sJoinStr)
End Function
BitToItem(bAlpth,ABCDEFG配列,"-")を処理すれば A-C-G が返ります。
記事にも書いたのだけれど
Convert.ToString(CType("0" & oBit.ToString, Integer), 2) で数字が2進数の文字列になります
Convert.ToString(CType("0" & oBit.ToString, Integer), 2).ToCharArray でChar型の配列に分割
でもこのままだと、69→"1000101" なので 配列の[0]は上位ビットになっちゃう。そこで
Array.Reverse(wArray) でこれを反転させて配列[0]を下位ビットに。ここまでくればこっちのモン(笑)
あとは、For i As Integer = LBound(wArray) To UBound(wArray) で作る事ができた配列要素分だけループして判定
区切り文字にvbCrを使って、1Char文字、まぁ文字列には入れてこないだろう値を仮置きしてとにかく連結。
連結し終わったら、TrimEnd(CChar(vbCr)) で最後の連結子となる尻尾を切ってから
Replace(vbCr, sJoinStr) で本来の連結子に置き換えて文字列完成
こういうのをちまちま組んでるのは楽しいんだけどなぁ(おい)