Day 93
题目描述

思路
初次思路:由于与运算只要出现0结果就是0了,于是我就想按位判断,从小到大依次判断出现0就将该位结果设置为0(超时了)
java
class Solution {
public int rangeBitwiseAnd(int left, int right) {
int res=0;
int tes=1;
int max=right;
int sum=0;
while(max!=0){//确定判断的最高位是多少
max=max>>1;
sum++;
}
for(int i=sum;i>=0;i--){
tes=1;
for(int j=left;j<=right;j++){
if((j>>i)%2==0){//取位
tes=0;
break;
}
}
res=(res<<1)+tes;
}
return res;
}
}
进阶思路:我们转变思路,将一个数组按位与求的是什么,求得是公共前缀(二进制的高位),如果不一样就是0,于是有如下做法:
java
class Solution {
public int rangeBitwiseAnd(int left, int right) {
int shift = 0;
// 找到left和right的公共前缀
while (left < right) {
left >>= 1;
right >>= 1;
shift++;
}
// 左移shift位,补回0
return left << shift;
}
}