def extract(self, high_bit, low_bit):
if high_bit - low_bit + <NUM_LIT:1> == self.bits:<EOL><INDENT>return self.copy()<EOL><DEDENT>if ('<STR_LIT>' in self._regions and len(self._regions.keys()) > <NUM_LIT:1>) orlen(self._regions.keys()) > <NUM_LIT:0>:<EOL><INDENT>si_ret = StridedInterval.top(high_bit - low_bit + <NUM_LIT:1>)<EOL><DEDENT>else:<EOL><INDENT>if '<STR_LIT>' in self._regions:<EOL><INDENT>si = self._regions['<STR_LIT>']<EOL>si_ret = si.extract(high_bit, low_bit)<EOL><DEDENT>else:<EOL><INDENT>si_ret = StridedInterval.empty(high_bit - low_bit + <NUM_LIT:1>)<EOL><DEDENT><DEDENT>return si_ret<EOL>
Operation extract

- A cheap hack is implemented: a copy of self is returned if (high_bit - low_bit + 1 == self.bits), which is a
    ValueSet instance. Otherwise a StridedInterval is returned.

:param high_bit:
:param low_bit:
:return: A ValueSet or a StridedInterval