题目链接:点击打开链接
Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers in this range, inclusive
For example, given the range [5, 7], you should return 4.
题目大意:输入两个数字m n(m<=n),返回m到n范围以内的所有数字与运算后的结果。
思路:与运算特点:0与任何数字都为0.所以在m到n范围内,每一个位上只要出现0,那么该位则为0.
考虑两个数的最后一位,如果两个数之间的某个数为偶数,则该位(最后一位)置为0.
只要两个数不相等,则这两个数之间必存在偶数,置为0.
然后将两个数一起向右移1位,继续比较两数,直至两数相等。
所以题目的解就相当于找出m和n二进制数最长的公共前缀,然后将其不同的后缀统统置为0.
算法时间复杂度O(logN).
<pre name="code" class="cpp">int rangeBitwiseAnd(int m, int n)
{
int i=0;
while(m!=n)
{
m>>=1;
n>>=1;
i++;
}
return m<<i;
}