Single Bit Binary Operations

def set_bit(x, position)
  raise 'position must be >= 0' if position < 0

  x | (1 << position)
end

puts set_bit(0, 0)
# 1

puts set_bit(0, 4)
# 16

puts set_bit(8, 3)
# 8

puts set_bit(8, 4)
# 24

begin
  puts set_bit(8, -4)
rescue StandardError => e
  puts e.message
end
# position must be >= 0

def clear_bit(x, position)
  raise 'position must be > 0' if position < 0

  x & ~(1 << position)
end

puts clear_bit(0, 0)
# 0

puts clear_bit(0, 4)
# 0

puts clear_bit(8, 3)
# 0

puts clear_bit(24, 4)
# 8

begin
  puts clear_bit(0, -4)
rescue StandardError => e
  puts e.message
end
# position must be > 0

def flip_bit(x, position)
  raise 'position must be > 0' if position < 0

  x ^ (1 << position)
end

puts flip_bit(0, 0)
# 1

puts flip_bit(0, 4)
# 16

puts flip_bit(8, 3)
# 0

puts flip_bit(24, 4)
# 8

begin
  puts flip_bit(0, -4)
rescue StandardError => e
  puts e.message
end
# position must be > 0

def is_bit_set(x, position)
  raise 'position must be > 0' if position < 0

  ((x >> position) & 1) == 1
end

puts is_bit_set(0, 0)
# false

puts is_bit_set(1, 0)
# true

puts is_bit_set(8, 3)
# true

puts is_bit_set(24, 4)
# true

begin
  puts is_bit_set(0, -4)
rescue StandardError => e
  puts e.message
end
# position must be > 0