git.mcksp
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
module Fork
  extend self

  def lsb(num : UInt64)
    num.trailing_zeros_count
  end

  def print_bitboard(board : UInt64)
    str = ""
    7.downto(0) do |row|
      0.upto(7) do |col|
        bit = 1_u64 << ((row * 8) + col)
        str += bit & board == 0 ? '.' : "x"
      end
      str += "\n"
    end
    puts str
  end

  def iterate_bitboard(bitboard : UInt64, &)
    while bitboard != 0
      position = lsb(bitboard)
      bit = (1u64 << position)
      yield position, bit
      bitboard ^= bit
    end
  end

  def pop_bit(bitboard : UInt64, index)
    bitboard & (~(1u64 << index))
  end

  def set_bit(bitboard : UInt64, index)
    bitboard | (1u64 << index)
  end
end