code: def crossover_2point_bit(self):
      """
      3 times faster than `crossover_2point`, but only use for 0/1 type of Chrom
      :param self:
      :return:
      """
      Chrom, size_pop, len_chrom = (
          self.Chrom,
          self.size_pop,
          self.len_chrom,
      )
      half_size_pop = int(size_pop / 2)
      Chrom1, Chrom2 = Chrom[:half_size_pop], Chrom[half_size_pop:]
      mask = np.zeros(shape=(half_size_pop, len_chrom), dtype=int)
      for i in range(half_size_pop):
          n1, n2 = np.random.randint(0, self.len_chrom, 2)
          if n1 > n2:
              n1, n2 = n2, n1
          mask[i, n1:n2] = 1
      mask2 = (Chrom1 ^ Chrom2) & mask
      Chrom1 ^= mask2
      Chrom2 ^= mask2
      return self.Chrom
  
imports: import numpy
label_desc: Use image node_id 3 for calling a global function with example usage: crossover_2point_bit() and returns: self