Operation extract

        :param high_bit:    The highest bit to begin extraction.
        :param low_bit:     The lowest bit to end extraction.
        :return:            Extracted bits.

def extract(self, high_bit, low_bit):
        """
        Operation extract

        :param high_bit:    The highest bit to begin extraction.
        :param low_bit:     The lowest bit to end extraction.
        :return:            Extracted bits.
        """
        # TODO: This method can be optimized

        ret = set()
        bits = high_bit - low_bit + 1

        for si in self._si_set:
            ret.add(si.extract(high_bit, low_bit))

        if len(ret) > 1:
            return DiscreteStridedIntervalSet(bits=bits, si_set=ret)

        else:
            return list(ret)[0]