2019-10-15 吴亲库里 库里的深夜食堂
这道题求[m,n]区间的按位与运算。

首先,0 和任何数相与都是0。也正是demo2的结果。那就看看几个demo。
给定[5,7]
5的二进制101
6的二进制110
7的二进制111
最终相与的结果就是100 转换为十进制即4
[20,23]
20 10100
21 10101
22 10110
23 10111
结果 10100 = 20
你可以看出这样的运算最后的结果就是求二进制左边公共的部分。如果不相等,使二进制的末位加1, 二进制进一位,只要进位说明末尾有0的存在,不断右移两个数进行比较,等到相等的时候,说明当前两个数最高位已经没有变化了,记录下位移的次数,左移相同位数即可。
/**
* @param Integer $m
* @param Integer $n
* @return Integer
*/
function rangeBitwiseAnd($m, $n) {
$count=0;
while($m !=$n){
$m>>=1;
$n>>=1;
$count++;
}
$n<<=$count;
return $n;
}
