code: func OnePointCrossover(g1, g2 *IGenome) (IGenome, IGenome) {
  
  	g1Bits, g2Bits := (*g1).GetBits(), (*g2).GetBits()
  
  	b1, b2 := Bitset{}, Bitset{}
  	g1Size := g1Bits.GetSize()
  	g2Size := g2Bits.GetSize()
  	b1.Create(g1Size)
  	b2.Create(g2Size)
  
  	maxSize := max(g1Size, g2Size)
  	minSize := min(g1Size, g2Size)
  	randIndex := rand.Intn(minSize-1) + 1
  
  	for i := 0; i < randIndex; i++ {
  		b1.Set(i, g1Bits.Get(i))
  		b2.Set(i, g2Bits.Get(i))
  	}
  
  	for i := randIndex; i < minSize; i++ {
  		b2.Set(i, g1Bits.Get(i))
  		b1.Set(i, g2Bits.Get(i))
  	}
  
  	if g1Size > g2Size {
  		for i := minSize; i < maxSize; i++ {
  			b2.Set(i, g1Bits.Get(i))
  		}
  	} else {
  		for i := minSize; i < maxSize; i++ {
  			b1.Set(i, g2Bits.Get(i))
  		}
  	}
  
  	return NewGenome(b1), NewGenome(b2)
  }
docs: // OnePointCrossover -
  // Accepts 2 genomes and combines them to create 2 new genomes using one point crossover
  // i.e.
  // input genomes of:
  // 000000 and 111111
  // could produce output genomes of:
  // 000111 and 111000