201. 数字范围按位与

 

 

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;
    }
}

 

posted @ 2020-08-07 16:05  Sexyomaru  阅读(133)  评论(0编辑  收藏  举报