题目:数据范围按位与
Description
给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。
Sample
输入: [5,7]
输出: 4
输入: [0,1]
输出: 0
Solution
暴力求解!显然当n和m相差一个2的次方级以上或者相差一个2的次方级时,结果必为0!
例如:3 5
3小于2的2次方,5大于2的2次方,中间有个2的2次方,4==100。3=011。显然每一位上都有0,所以结果必为0!
如果m和n在一个2的次方级内,逐一枚举按位与即可!虽然很暴力,不过感觉会比较容易理解!
class Solution {
public:
int rangeBitwiseAnd(int m, int n) {
if(m==0||n==0) return 0; //特判一下
if(m==n) return m;
int ans;
for(int i=0;i<32;i++){
if(pow(2,i)>m){
ans=i;
break;
}
}
if(n<pow(2,ans)){//m和n在一个2的次方级内
ans=m;
for(long long i=m+1;i<=n;i++){//枚举 这里i=m+1,用一下longlong防止爆int
ans=ans&i;
}
return ans;
}
else return 0;//m和n不在一个2的次方级内,直接返回0
}
};