lib/solver/domain/packed_min_max.ex

defmodule PackedMinMax do
  import Bitwise

  def get_min(packed, size \\ 32) do
    packed &&& all_bits_mask(size)
  end

  def get_max(packed, size \\ 32) do
    packed >>> size
  end

  def set_min(packed, min_value, size \\ 32) do
    get_max(packed, size) <<< size ||| min_value
  end

  def set_max(packed, max_value, size \\ 32) do
    max_value <<< size ||| get_min(packed, size)
  end

  defp all_bits_mask(size) do
    (1 <<< size) - 1
  end
end