问题描述
Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers in this range, inclusive.
Example 1:
Input: [5,7]
Output: 4
Example 2:
Input: [0,1]
Output: 0
首先考虑一种特殊情况,有两个数字p, q,他们用二进制分别表示为
xyz0111
xyz1000
也即,从
2
a
−
1
2^{a}-1
2a−1变为
2
a
2^a
2a,此时末尾几位数字取AND的结果为0000。
我们再拓展到
[
m
,
n
]
[m, n]
[m,n]这个区间上。我们不妨假设
m
,
n
m,n
m,n最高的
k
k
k位是一样的,对应上例中的xyz,它们取AND的结果还是xyz。当
m
,
n
m,n
m,n从第
k
+
1
k+1
k+1位开始不同时,第
k
+
1
k+1
k+1位一定是
n
n
n中取1,而
m
m
m中取0,因为
n
≥
m
n\geq m
n≥m。
这意味着什么呢?
我们一点点增加
m
m
m,一定会出现形如xyz0111的数字,同理我们一点点缩小
n
n
n,也一定会出现xyz1000,这两个数字均在
[
m
,
n
]
[m,n]
[m,n]中。结合我们上边的分析结果,在这种情况下,第
k
+
1
k+1
k+1位以后的AND结果应该是全0。
这样一来我们的算法就很明确了,找出
k
k
k的值,将
m
,
n
m,n
m,n的前
k
k
k位维持不变,而后边的位全置为0,就得到了输出的结果。
Python代码如下:
def rangeBitwiseAnd(self, m, n):
i = 0
while m != n:
m >>= 1
n >>= 1
i += 1
return n << i