题意:求区间内所有数字按位与的结果。
思路:对于区间中的数字,没有进位的情况下是不会出现0的,所以应当考虑需要进位的位数。高位的数字是保持的,只要考虑低位有多少进位。因此用区间的跨度计算进位的个数。
class Solution {
public:
int rangeBitwiseAnd(int m, int n) {
int re = m & n;
int p = 0xffffffff;
int diff = n - m;
while(diff) {
p <<= 1;
diff /= 2;
}
return p & re;
}
};
另一种思路不断去掉末尾的1,直到小于等于原来的值。
class Solution {
public:
int rangeBitwiseAnd(int m, int n) {
while(m < n) n &= n - 1;
return n;
}
};