给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。
示例 1:
输入: [5,7]
输出: 4
示例 2:
输入: [0,1]
输出: 0
思路:因为需要m~n之间所有的数都按位与,例如[234,236],所以我们只需要找到最高位即可,也就是说我们依次右移,知道n和m相等即可,如图所示。
代码:
int rangeBitwiseAnd(int m, int n) {
int t = 0;
//当n和m不相等就n和m往右移,同时记录下右移了多少位
while(n - m >= 1)
{
n >>= 1;
m >>= 1;
t++;
}
//当n和m相等时,让m左移t位即可
return m << t;
}