![]()
class Solution {
public int rangeBitwiseAnd(int m, int n) {
// 1.如果m与n二进制位数不同的话 由m到n每一位二进制位都出现过0,这里可以解释为:
//由低位向高位进位时,低位会出现0,位数少的数所有位都会出现0
//比如从所有的三位二进制数如111或110或100到1111 一定会出现1000的情况
//只要这一位出现过0,那么按位与的二进制结果中这一位必然为0,
//所以位数不同的话,每位都出现过0,结果为0。
// 2.如果m与n二进制位数相同的话,二进制位从高位到低位必然会有一段公共前缀,而m与n之间的数
//也必然有相同的公共前缀,只有后面的二进制位不同,且每位必会出现0
//所以最后的结果中后面位数全部为0,所以将m,n同时右移
//移到公共前缀部分的时候 m n相同,然后再将后面的0补上,右移多少次就将它左移多少次就可以了
if(m == 0 || m == n) return m;
int num = 0;
while(m != n) { // 二进制位不同的情况下,只有移动到0,它两才会相等退出,0右移结果还是0
m >>= 1;
n >>= 1;
num++;
}
return m << num;
}
}