First let's have some observation. For example,
m == 5 and
bin(m) == '0b101'. If
n == 8, then
bin(n) == '0b1000'. We can easily see the answer is 0 when
len(bin(m)) < len(bin(n)).
Okay, what if
len(bin(m)) == len(bin(n))? We just add the first bit into our accumulative answer and recursively processing for both
n without first bit in their binary representation.
class Solution(object): def rangeBitwiseAnd(self, m, n): """ :type m: int :type n: int :rtype: int """ mask = 1 << len(bin(n)) - 3 return 0 if not m or len(bin(m)) < len(bin(n)) else \ mask + self.rangeBitwiseAnd(m & (mask-1), n & (mask-1))