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