Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers in this range, inclusive.
For example, given the range [5, 7], you should return 4.
解题思路
这道题的意思是将[m,n]之间的数全部进行&
操作,求最后的值。我们不妨设m和n这两个数字前k位二进制数相同,即:
m=a1a2...ak0ak+2...a32 n=a1a2...ak1ak+2...a32
对于第k+2位二进制数到第32位,我们总可以找到一个[m,n]之间的数,使得该数位上的二进制数值为0
所以我们要求的值为
ans = a1a2...ak00...0(32-k个0)
我们来看具体的求法:
class Solution {
public:
int rangeBitwiseAnd(int m, int n) {
while (n > m){
n &= (n-1);
}
return n;
}
};
n &= (n-1)
这行代码的含义是将n的二进制数最低位的1变为0,所以整段代码是不断将n的二进制数最低位的1变为0直到n <= m
,也就求出了我们要求的ans
。
举个栗子
初始
7 = 1011, 5 = 1001,可知我们要求的ans = 1000
循环过程
7 -> 1011 -> 1010 -> 1000 <= 5 所以ans = 1000 = 4