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

1 Answer

0 votes
object RemoveBitsShift {

  /*
      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.
  */
  def removeBitsAndShift(number: Int, positions: List[Int]): Int = {

    // Sort positions descending
    val sorted: List[Int] = positions.sortWith(_ > _)

    var result: Int = number

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

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

    result
  }

  /*
      printBinary(n)
      --------------
      Prints a 32-bit binary representation of an integer.
  */
  def printBinary(n: Int): Unit = {
    val binary: String = n.toBinaryString.reverse.padTo(32, '0').reverse
    val grouped: String = binary.grouped(4).mkString(" ")
    println(grouped)
  }

  def main(args: Array[String]): Unit = {

    val number: Int = 1234                   // 0000 0000 0000 0000 0000 0100 1101 0010
    val positions: List[Int] = List(1, 3, 7) // remove bits 1, 3, 7 (0 = LSB)

    println("Original number in binary:")
    printBinary(number)

    val result: Int = removeBitsAndShift(number, positions)

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

    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

...