How to zero every n-bit from a number if that bit is 1 in VB.NET

1 Answer

0 votes
Imports System

Module ZeroBitsEveryStepProgram

    '
    ' zeroBitsEveryStep(number, step)
    ' -------------------------------
    ' Zeros every `step`-th bit (0-based from LSB)
    ' but only if that bit is currently 1.
    '
    ' Example:
    '     number = 536870911
    '     step = 3  → zero bits 0, 3, 6, 9, ...
    '
    Function zeroBitsEveryStep(number As Integer, _step As Integer) As Integer

        Dim resultValue As Integer = number

        For pos As Integer = 0 To 31 Step _step

            Dim mask As Integer = 1 << pos

            ' If the bit is 1, zero it
            If (resultValue And mask) <> 0 Then
                resultValue = resultValue And Not mask
            End If

        Next

        Return resultValue
    End Function

    '
    ' printBinary(n)
    ' --------------
    ' Prints a 32-bit binary representation of an integer.
    '
    Sub printBinary(n As Integer)

        Dim s As String = Convert.ToString(n, 2).PadLeft(32, "0"c)

        For i As Integer = 0 To 31
            Console.Write(s(i))
            If (i + 1) Mod 4 = 0 Then Console.Write(" ")
        Next

    End Sub

    Sub Main()

        Dim number As Integer = 536870911   ' 0001 1111 1111 1111 1111 1111 1111 1111
        Dim stepValue As Integer = 3        ' zero bits 0, 3, 6, 9, ...

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

        Dim resultValue As Integer = zeroBitsEveryStep(number, stepValue)

        Console.WriteLine()
        Console.WriteLine()
        Console.WriteLine("Number after zeroing every " & stepValue &
                          " bits (only if bit was 1):")
        printBinary(resultValue)

        Console.WriteLine()
        Console.WriteLine()
        Console.WriteLine("Result as integer: " & resultValue)

    End Sub

End Module



'
' run:
'
' Original number in binary:
' 0001 1111 1111 1111 1111 1111 1111 1111 
'
' Number after zeroing every 3 bits (only if bit was 1):
' 0001 0110 1101 1011 0110 1101 1011 0110 
'
' Result as integer: 383479222
'

 



answered 18 hours ago by avibootz
...