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
给定范围[m,n],其中0 <= m <= n <= 2147483647,返回此范围内(包括两端)的所有数字的按位与。
这题很明显是道数学题,优化算法就必须要从数学入手。
首先我们研究下与操作,所谓与操作就是只有1和1才能得1。我们把第一个例子化为2进制
0111 7
0110 6
0101 5
————
0100 4
从这里我们可以看出只要某一位中出现一个0,那么这一位必为0.而除去最大和最小的数字以外,中间的数字总会扰乱最大最小数字的最后几位,举个例子,17(1 0001)到31(1 1111)之间会出现很多数字,它们变化的位数是1-4位。但是我们不需要去研究中间的数字,我们只要知道17到31的所有数字的第5位是从来不变的,所以说我们只要研究最大和最小的数字的从左到右数哪几位是相同的,这几个相同的就是他们以及他们之间数字不变的位数。由此就很容易写出程序来了
可能讲的不清楚,见谅把
class Solution {
public:
int rangeBitwiseAnd(int m, int n) {
int pos = 0;
for(;m >> pos != n >> pos; pos++);
return m>>pos<<pos;
}
};