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

1 Answer

0 votes
object ZeroBitsEveryStep {

  /*
      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, ...
  */
  def zeroBitsEveryStep(number: Int, step: Int): Int = {
    var result = number

    var pos = 0
    while (pos < 32) {
      val mask = 1 << pos

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

      pos += step
    }

    result
  }

  /*
      printBinary(n)
      --------------
      Prints a 32-bit binary representation of an integer.
      Scala does not support zero‑padded binary in f-strings,
      so we pad manually.
  */
  def printBinary(n: Int): Unit = {
    val s = n.toBinaryString.reverse.padTo(32, '0').reverse
    val grouped = s.grouped(4).mkString(" ")
    println(grouped)
  }

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

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

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

    val result = zeroBitsEveryStep(number, step)

    println(s"\nNumber after zeroing every $step bits (only if bit was 1):")
    printBinary(result)

    println(s"\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 13 hours ago by avibootz
...