def _rshift_arithmetic(self, shift_amount):
if self.is_empty:<EOL><INDENT>return self<EOL><DEDENT>nsplit = self._nsplit()<EOL>if len(nsplit) == <NUM_LIT:1>:<EOL><INDENT>highest_bit_set = self.lower_bound > StridedInterval.signed_max_int(nsplit[<NUM_LIT:0>].bits)<EOL>l = self.lower_bound >> shift_amount<EOL>u = self.upper_bound >> shift_amount<EOL>stride = max(self.stride >> shift_amount, <NUM_LIT:1>)<EOL>mask = ((<NUM_LIT:2> ** shift_amount - <NUM_LIT:1>) << (self.bits - shift_amount))<EOL>if highest_bit_set:<EOL><INDENT>l = l | mask<EOL>u = u | mask<EOL><DEDENT>if l == u:<EOL><INDENT>stride = <NUM_LIT:0><EOL><DEDENT>return StridedInterval(bits=self.bits,<EOL>lower_bound=l,<EOL>upper_bound=u,<EOL>stride=stride,<EOL>uninitialized=self.uninitialized<EOL>)<EOL><DEDENT>else:<EOL><INDENT>a = nsplit[<NUM_LIT:0>]._rshift_arithmetic(shift_amount)<EOL>b = nsplit[<NUM_LIT:1>]._rshift_arithmetic(shift_amount)<EOL>return a.union(b)<EOL><DEDENT>
Arithmetic shift right with a concrete shift amount

:param int shift_amount: Number of bits to shift right.
:return: The new StridedInterval after right shifting
:rtype: StridedInterval