原题目:https://leetcode-cn.com/problems/bitwise-and-of-numbers-range/
思路一:
如果有一位是0,那么该位最终就会是0,基于此,算法描述如下:找出公共前缀,左移。
公共前缀,m>>1,n>>1直到两者相等
思路二:
Brian Kernighan 算法。用于清除二进制串最右边的一。基于此,我们可以找到公共前缀
代码:
class Solution {
public:
int rangeBitwiseAnd(int m, int n) {
int count=0;
while(m!=n){
m>>=1;
n>>=1;
++count;
}
return m<<count;
}
};
class Solution {
public:
int rangeBitwiseAnd(int m, int n) {
while(n>m){
n &= (n-1);
}
return n;
}
};