# Print bits of a 32-bit integer
def print_bits(x: int, label: str) -> None:
# Convert to binary and pad to 32 bits
bits = format(x & 0xFFFFFFFF, "032b")
print(f"{label}: {bits}")
# Clear bits in range [l, r] inclusive (0 = least significant bit)
def clear_bits(x: int, l: int, r: int) -> int:
if l < 0 or r > 31 or l > r:
raise ValueError("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
mask_left = (~0 << (r + 1)) & 0xFFFFFFFF
print_bits(mask_left, "maskLeft ")
# maskRight:
# Create a mask with 1s below bit l and 0s from bit l upward.
# Example: l = 3 → maskRight = 00000000 00000000 00000000 00000111
mask_right = ((1 << l) - 1) & 0xFFFFFFFF
print_bits(mask_right, "maskRight")
# Combine both masks:
# mask_left keeps bits above r.
# mask_right keeps bits below l.
# The range [l, r] becomes 0s.
mask = (mask_left | mask_right) & 0xFFFFFFFF
print_bits(mask, "mask ")
return x & mask
def main():
value = 0b11111100111111001111110011111100
l = 3 # start bit
r = 10 # end bit
result = clear_bits(value, l, r)
print_bits(value, "Before ")
print_bits(result, "After ")
if __name__ == "__main__":
main()
'''
run:
maskLeft : 11111111111111111111100000000000
maskRight: 00000000000000000000000000000111
mask : 11111111111111111111100000000111
Before : 11111100111111001111110011111100
After : 11111100111111001111100000000100
'''