@normalize_types<EOL><INDENT>def bitwise_and(self, t):<DEDENT>
"""<STR_LIT>"""<EOL>s = self<EOL>def number_of_ones(n):<EOL><INDENT>ctr = <NUM_LIT:0><EOL>while n > <NUM_LIT:0>:<EOL><INDENT>ctr += <NUM_LIT:1><EOL>n &= n - <NUM_LIT:1><EOL><DEDENT>return ctr<EOL><DEDENT>for a, b in [[s, t], [t, s]]:<EOL><INDENT>if a.is_integer and number_of_ones(a.lower_bound) == <NUM_LIT:1>:<EOL><INDENT>if a.lower_bound == (<NUM_LIT:1> << (t.bits - <NUM_LIT:1>)):<EOL><INDENT>stride = <NUM_LIT:1> << (a.bits - <NUM_LIT:1>)<EOL>if b.is_integer:<EOL><INDENT>if b.lower_bound == stride:<EOL><INDENT>return StridedInterval(bits=b.bits, stride=<NUM_LIT:0>, lower_bound=stride, upper_bound=stride)<EOL><DEDENT>else:<EOL><INDENT>return StridedInterval(bits=b.bits, stride=<NUM_LIT:0>, lower_bound=<NUM_LIT:0>, upper_bound=<NUM_LIT:0>)<EOL><DEDENT><DEDENT>else:<EOL><INDENT>is_sol = (a.lower_bound - b.lower_bound) % b.stride == <NUM_LIT:0> and b.lower_bound <= a.lower_bound <= b.upper_bound<EOL>if is_sol:<EOL><INDENT>return StridedInterval(bits=b.bits, stride=stride, lower_bound=<NUM_LIT:0>, upper_bound=stride)<EOL><DEDENT>else:<EOL><INDENT>return StridedInterval(bits=b.bits, stride=<NUM_LIT:0>, lower_bound=<NUM_LIT:0>, upper_bound=<NUM_LIT:0>)<EOL><DEDENT><DEDENT><DEDENT>else:<EOL><INDENT>pass<EOL><DEDENT><DEDENT><DEDENT>new_interval = s.bitwise_not().bitwise_or(t.bitwise_not()).bitwise_not()<EOL>return new_interval.normalize()<EOL>
Binary operation: logical and

:param b: The other operand
:return: