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