これのリベンジ中(ひつこい)
で、ちょこっとまた変えてみました。みなさんのアドバイスを元に今度はInteger.Parseも利用。ビット判定をシフト式でできると言う事を思い出してここまで変更。
Protected Function BitToItem(ByVal oBit As Object, ByVal aLabels() As String, ByVal sJoinStr As String) As String
'ビット数値と配列から、ビットONとなっている相対配列の文字列を連結して返す
'リターンワークの準備
Dim retStr As String = ""
'変換用数値
Dim wInt As Integer = Integer.Parse("0" & oBit.ToString)
'ビットを01の2進数配列にセット
Dim wArray() As Char = Convert.ToString(wInt, 2).ToCharArray
'ビットONにあわせて、配列の値を連結
For i As Integer = LBound(wArray) To UBound(wArray)
If CBool(wInt And (1 << i)) Then
retStr += aLabels(i) & vbCr
End If
Next
Return retStr.TrimEnd(CChar(vbCr)).Replace(vbCr, sJoinStr)
End Function
次の課題は、渡された数字が最大何ビットを持つのかを取る事。今って、CharArrayにして配列とって回数にしてるから、ここがまだスマートになると思う。天邪鬼なのでDoWhileで2で割り続ける……ではない方法でこう、なんかありそうな気がしてるんだけど……むぅ。
で、えぴさんちでのこれから玉子様のロジックで「ぴきーんっ」があって、ちょっとまた改変。
Protected Function BitToItem(ByVal oBit As Object, ByVal aLabels() As String, ByVal sJoinStr As String) As String
'ビット数値と配列から、ビットONとなっている相対配列の文字列を連結して返す
'リターンワークの準備
Dim retStr As String = ""
'変換用数値
Dim wInt As Integer = Integer.Parse("0" & oBit.ToString)
'ビットONにあわせて、配列の値を連結
For i As Integer = 0 To Convert.ToString(wInt, 2).Length
If CBool(wInt And (1 << i)) Then
retStr += aLabels(i) & vbCr
End If
Next
Return retStr.TrimEnd(CChar(vbCr)).Replace(vbCr, sJoinStr)
End Function
こんなカンジ。よく考えたら、配列ワークを取るって必要がなくなっちゃったわけだから、配列の上限がわかってしまえば良いはず。後はビット飛ばして時が見えたらOK~!!って何か違うような気がするがきっとそうだ。ほんとか?