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

1 Answer

0 votes
#
# zero_bits_every_step(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 zero_bits_every_step(number, step)
  result = number

  pos = 0
  while pos < 32
    mask = 1 << pos

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

    pos += step
  end

  result
end

#
# print_binary(n)
# ---------------
# Prints a 32-bit binary representation of an integer.
#
def print_binary(n)
  s = n.to_s(2).rjust(32, "0")
  grouped = s.chars.each_slice(4).map(&:join).join(" ")
  puts grouped
end

# Main program
number = 536_870_911   # 0001 1111 1111 1111 1111 1111 1111 1111
step   = 3             # zero bits 0, 3, 6, 9, ...

puts "Original number in binary:"
print_binary(number)

result = zero_bits_every_step(number, step)

puts "\nNumber after zeroing every #{step} bits (only if bit was 1):"
print_binary(result)

puts "\nResult as integer: #{result}"



=begin
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

=end

 



answered 13 hours ago by avibootz
...