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

1 Answer

0 votes
package main

import (
    "fmt"
    "sort"
)

/*
    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.
*/
func removeBitsAndShift(number int, positions []int) int {

    // Sort positions descending
    sorted := make([]int, len(positions))
    copy(sorted, positions)
    sort.Sort(sort.Reverse(sort.IntSlice(sorted)))

    result := number

    for _, pos := range sorted {
        left := result >> (pos + 1)          // bits above removed bit
        right := result & ((1 << pos) - 1)   // bits below removed bit

        result = (left << pos) | right       // merge
    }

    return result
}

/*
    printBinary(n)
    --------------
    Prints a 32-bit binary representation of an integer.
*/
func printBinary(n int) {
    bin := fmt.Sprintf("%032b", n)

    // Insert spaces every 4 bits
    for i := 0; i < 32; i++ {
        fmt.Printf("%c", bin[i])
        if (i+1)%4 == 0 {
            fmt.Print(" ")
        }
    }
    fmt.Println()
}

func main() {
    var number int = 1234              // 0000 0000 0000 0000 0000 0100 1101 0010
    var positions []int = []int{1, 3, 7} // remove bits 1, 3, 7 (0 = LSB)

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

    result := removeBitsAndShift(number, positions)

    fmt.Println("\nNumber after removing bits {1, 3, 7} and shifting remaining bits:")
    printBinary(result)

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


/*
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

...