object ClearBitsRange {
// Print bits of a 32-bit integer
def printBits(x: Int, label: String): Unit = {
// Convert to binary and pad to 32 bits
val bits = String.format("%32s", Integer.toBinaryString(x & 0xFFFFFFFF))
.replace(' ', '0')
println(s"$label: $bits")
}
// Clear bits in range [l, r] inclusive (0 = least significant bit)
def clearBits(x: Int, l: Int, r: Int): Int = {
if (l < 0 || r > 31 || l > r)
throw new IllegalArgumentException("Invalid bit range")
// maskLeft:
// Create a mask with 1s above bit r and 0s from bit r down to 0.
// Example: r = 5 → maskLeft = 11111111 11111111 11111111 11000000
val maskLeft = (~0 << (r + 1)) & 0xFFFFFFFF
printBits(maskLeft, "maskLeft ")
// maskRight:
// Create a mask with 1s below bit l and 0s from bit l upward.
// Example: l = 3 → maskRight = 00000000 00000000 00000000 00000111
val maskRight = ((1 << l) - 1) & 0xFFFFFFFF
printBits(maskRight, "maskRight")
// Combine both masks:
// maskLeft keeps bits above r.
// maskRight keeps bits below l.
// The range [l, r] becomes 0s.
val mask = (maskLeft | maskRight) & 0xFFFFFFFF
printBits(mask, "mask ")
x & mask
}
def main(args: Array[String]): Unit = {
val value = 0b11111100111111001111110011111100
val l = 3 // start bit
val r = 10 // end bit
val result = clearBits(value, l, r)
printBits(value, "Before ")
printBits(result, "After ")
}
}
/*
run:
maskLeft : 11111111111111111111100000000000
maskRight: 00000000000000000000000000000111
mask : 11111111111111111111100000000111
Before : 11111100111111001111110011111100
After : 11111100111111001111100000000100
*/