Home > Enterprise >  VB.NET Count bits, 1's are counted as 1, Zero's are counted together in a sequence between
VB.NET Count bits, 1's are counted as 1, Zero's are counted together in a sequence between

Time:11-07

Looking to count bits in a sequence.

1's are counted as 1, Zero's are counted together in a sequence between 1's

If you look at this picture
pic

The output should be 2,1,5,1,1,3,2,1

Here is my code it works on 80% of numbers sometimes it messes up.

dim bitmask() as byte
redim bitmask(15)
bitmask(0) = 0
bitmask(1) = 0
bitmask(2) = 1
bitmask(3) = 0
bitmask(4) = 0
bitmask(5) = 0
bitmask(6) = 0
bitmask(7) = 0
bitmask(8) = 1
bitmask(9) = 1
bitmask(10) = 0
bitmask(11) = 0
bitmask(12) = 0
bitmask(13) = 1
bitmask(14) = 0
bitmask(15) = 1


Public Function GetBitCount() As Byte()
    Dim count As Byte = 0
    Dim bitcounts As New List(Of Byte)
    Dim indexOfNext As Integer = 0
    Dim totalCounted As Integer = 0
    While True
        indexOfNext = Array.IndexOf(bitmask, CByte(1), indexOfNext   1)

        If indexOfNext > 0 Then
            If indexOfNext - totalCounted = 1 Then
                bitcounts.Add(2)
                bitcounts.Add(1)
            ElseIf indexOfNext - totalCounted > 0 Then
                bitcounts.Add(IIf(totalCounted > 0, indexOfNext - totalCounted, indexOfNext))
            ElseIf indexOfNext - totalCounted > 1 Then
                bitcounts.Add(2)
                bitcounts.Add(1)
            Else
                bitcounts.Add(1)
                bitcounts.Add(1)
            End If
            If totalCounted = 0 Then bitcounts.Add(1)
            totalCounted = indexOfNext   1
        Else
            Exit While
        End If
    End While
    If totalCounted - 1 > 2 AndAlso totalCounted - 1 < bitmask.Length - 1 Then
        bitcounts.Add(1)
        bitcounts.Add((bitmask.Length - 1) - (totalCounted - 1))
    ElseIf totalCounted - 1 <= 2 AndAlso totalCounted - 1 < bitmask.Length - 1 Then
        bitcounts.Add((bitmask.Length - 1) - (totalCounted - 1))
    Else
        bitcounts.Add(1)
    End If
    If count > 0 Then bitcounts.Add(count)
    Return bitcounts.ToArray()
End Function

CodePudding user response:

Solution

Public Function GetBitCount() As Byte()
    Dim i As Integer = 0
    Dim count As Byte = 0
    Dim bitcounts As New List(Of Byte)
    For i = 0 To bitmask.Length - 1
        If bitmask(i) = 1 Then
            bitcounts.Add(count)
            count = 0
        End If
        count  = 1
    Next
    If count > 0 Then bitcounts.Add(count)
    Return bitcounts.ToArray()
End Function
  • Related