# remove_bits_and_shift(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 remove_bits_and_shift(number, positions) # number: Integer, positions: Array<Integer>
sorted = positions.sort.reverse # sort descending
result = number # Integer
sorted.each do |pos|
left = result >> (pos + 1) # bits above removed bit
right = result & ((1 << pos) - 1) # bits below removed bit
result = (left << pos) | right # merge
end
result
end
# print_binary(n)
# ----------------
# Prints a 32-bit binary representation of an integer.
def print_binary(n) # n: Integer
binary = "%032b" % n
grouped = binary.scan(/.{4}/).join(" ")
puts grouped
end
# Main program
number = 1234 # Integer
positions = [1, 3, 7] # Array<Integer>
puts "Original number in binary:"
print_binary(number)
result = remove_bits_and_shift(number, positions)
puts "\nNumber after removing bits {1, 3, 7} and shifting remaining bits:"
print_binary(result)
puts "\nResult as integer: #{result}"
=begin
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
=end