原题网址:https://leetcode.com/problems/bitwise-and-of-numbers-range/
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的高位比特的公共前缀。
方法一:变动前缀本身。
public class Solution {
public int rangeBitwiseAnd(int m, int n) {
int prefix = 0;
int hi = 1 << 30;
for(int i=0; i<31; i++) {
int next = hi | (prefix >> 1);
int pm = m & next;
int pn = n & next;
if (pm != pn) return prefix & m;
prefix = next;
}
return prefix & m;
}
}
方法二:变动m和n本身。
public class Solution {
public int rangeBitwiseAnd(int m, int n) {
int move = 0;
while (m != n) {
m >>= 1;
n >>= 1;
move ++;
}
return m << move;
}
}
方法三:删除n的低位部分。
public class Solution {
public int rangeBitwiseAnd(int m, int n) {
while (m<n) n = n & (n-1);
return n;
}
}