How to zero every n-bit from a number if that bit is 1 in Go

1 Answer

0 votes
package main

import (
    "fmt"
    "strings"
)

/*
    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, ...
*/
func zeroBitsEveryStep(number int, step int) int {

    result := number

    for pos := 0; pos < 32; pos += step {

        mask := 1 << pos

        // If the bit is 1, zero it
        if (result & mask) != 0 {
            result &= ^mask
        }
    }

    return result
}

/*
    printBinary(n)
    --------------
    Prints a 32-bit binary representation of an integer.
*/
func printBinary(n int) {

    s := fmt.Sprintf("%032b", n)

    var out strings.Builder
    for i := 0; i < 32; i++ {
        out.WriteByte(s[i])
        if (i+1)%4 == 0 {
            out.WriteString(" ")
        }
    }

    fmt.Println(out.String())
}

func main() {

    number := 536870911 // 0001 1111 1111 1111 1111 1111 1111 1111
    step := 3           // zero bits 0, 3, 6, 9, ...

    fmt.Println("Original number in binary:")
    printBinary(number)

    result := zeroBitsEveryStep(number, step)

    fmt.Println("\nNumber after zeroing every", step, "bits (only if bit was 1):")
    printBinary(result)

    fmt.Println("\nResult as integer:", result)
}



/*
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 14 hours ago by avibootz
...