How to remove multiple bits from a number and shift the remaining bits right to fill the gaps in VB.NET

1 Answer

0 votes
Imports System
Imports System.Text.RegularExpressions

Module Program

    '
    ' removeBitsAndShift(number, positions)
    ' -------------------------------------
    ' Removes multiple bit positions from a number and shifts the remaining bits
    ' right to fill the gaps.
    '
    ' Important:
    '     Bits must be removed from highest → lowest position.
    '     Otherwise earlier removals shift the positions of later ones.
    '
    Function RemoveBitsAndShift(number As Integer, positions() As Integer) As Integer

        ' Copy and sort positions descending
        Dim sorted = CType(positions.Clone(), Integer())
        Array.Sort(sorted)
        Array.Reverse(sorted)

        Dim result As Integer = number

        For Each pos In sorted

            Dim leftPart As Integer = result >> (pos + 1)          ' bits above removed bit
            Dim rightPart As Integer = result And ((1 << pos) - 1) ' bits below removed bit

            result = (leftPart << pos) Or rightPart                ' merge
        Next

        Return result
    End Function

    '
    ' printBinary(n)
    ' --------------
    ' Prints a 32-bit binary representation of an integer.
    '
    Sub PrintBinary(n As Integer)
        Dim binary As String = Convert.ToString(n, 2).PadLeft(32, "0"c)

        ' Group into 4-bit chunks
        binary = Regex.Replace(binary, "(.{4})", "$1 ")

        Console.WriteLine(binary)
    End Sub

    Sub Main()

        Dim number As Integer = 1234          ' 0000 0000 0000 0000 0000 0100 1101 0010
        Dim positions() As Integer = {1, 3, 7} ' remove bits 1, 3, 7 (0 = LSB)

        Console.WriteLine("Original number in binary:")
        PrintBinary(number)

        Dim result As Integer = RemoveBitsAndShift(number, positions)

        Console.WriteLine()
        Console.WriteLine("Number after removing bits {1, 3, 7} and shifting remaining bits:")
        PrintBinary(result)

        Console.WriteLine()
        Console.WriteLine("Result as integer: " & result)
    End Sub

End Module


'
' run:
'
' Original number in binary:
' 0000 0000 0000 0000 0000 0100 1101 0010 
'
' Number after removing bits {1, 3, 7} and shifting remaining bits:
' 0000 0000 0000 0000 0000 0000 1001 0100 
'
' Result as integer: 148
'

 



answered 1 day ago by avibootz

Related questions

...