题目描述
给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。
题解
对所有数字执行按位与运算的结果是所有对应二进制字符串的公共前缀再用零补上后面的剩余位。也就是说,除了前面的公共前缀,非公共部分都是[0001,1000],这些做与操作后就是0,所以找到公共前缀,再在后面补上相应的0即可。
此题还可以用另一个方法:消除数字num最右边的1,可以用方法num=num&(num-1)做到。
代码
class Solution {
public:
int rangeBitwiseAnd(int m, int n) {
int pos=0;//记录右移的位数
while(m<n){
m>>=1;
n>>=1;
pos++;
}
return m<<pos;
}
};
class Solution {
public:
int rangeBitwiseAnd(int m, int n) {
while(m<n){
n=n&(n-1);
}
return n;
}
};