题目翻译:
0 <= m <= n <= 2147483647,求取m到n之间所有数字相与运算的结果。
分析:DONE
笨办法,直接相与,显然容易超时。
class Solution {
public:
int rangeBitwiseAnd(int m, int n) {
int result=0xffff;
for(int i=m;i<=n;i++)
result&=i;
return result;
}
};
m到n之间的数的低位只要不相同,相与就是0,所有数的高位(通过位移实现)相同即可得到结果,但是高位不相同直接就是0。
比如【5,6,7】 二进制表示分别为:、
101
110
& 111
显然三数只有第一列是相同的,所以结果显然是100
又比如【1,2,3,4】 二进制表示分别为:
001
010
011
& 100
显然所有同一列的位均不相同,结果为0.
那么怎么得到哪些列的1位是相同的?右移运算!所有数同时右移运算后的结果相同,此时就是答案,但是如果谁先被移位为0,显然结果就是0。通过别人的提示发现,实际m到n之间的所有数相与,只需这m,n两个数计算即可(因为m和n是最难保持一致,如果他们都通过移位保持一致了,那么中间那些数一定也可以保持一致)。
位运算解法,代码如下:
class Solution {
public:
int rangeBitwiseAnd(int m, int n) {
if(m==0 || n==0)
return 0;
int offset=0;
while(m!=0 && m!=n)//较小者一旦变为0,结果一定是0
{
m>>=1;//往右移1位,并且将结果赋值给m
n>>=1;
offset++;//统计移位数目
}
return m<<offset;//移回去
}
};
注:本博文为EbowTang原创,后续可能继续更新本文。如果转载,请务必复制本条信息!
原文地址:http://blog.csdn.net/ebowtang/article/details/51644688
原作者博客:http://blog.csdn.net/ebowtang
本博客LeetCode题解索引:http://blog.csdn.net/ebowtang/article/details/50668895