标签:
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.
Credits:
Special thanks to @amrsaqr for adding this problem and creating all test cases.
Bit Manipulation
这道题开始最简单想到的是从m到n一个个位与,超时了
接着想到每一位,从m到n依次看是否为0还是1,发现还是超时了
最后比较快的想法是,int有32位,除去最高位的符号位,从最高位算起,只要有m和n中有不相同的,低位就不用算了,肯定不相同
#include<iostream>
using namespace std;
/*
int rangeBitwiseAnd(int m, int n) {
int a=m;
for(int i=m;i<=n;i++)
a=a&i;
return a;
}*/
/*
int rangeBitwiseAnd(int m, int n)
{
int last=0;
for(int i=0;i<31;i++)
{
int flag=0;
for(int j=m;j<=n;j++)
if((j&(1<<i))==0)
{
flag=1;
break;
}
if(flag==0)
last+=(1<<i);
}
return last;
}
*/
int rangeBitwiseAnd(int m, int n)
{
int last=0;
for(int i=30;i>=0;i--)//注意这里从30开始,因为最高位为符号位
{
if((m&(1<<i))==(n&(1<<i)))//若是这一位数相同
{
if((m&(1<<i))!=0)//不为0
last+=(1<<i);
}
else
break;
}
return last;
}
int main()
{
//cout<<(1<<30)<<endl;
//cout<<(1<<2)<<endl;
//cout<<((1<<31)-1)<<endl;
cout<<rangeBitwiseAnd(1,9)<<endl;
}
leetcode_201题——Bitwise AND of Numbers Range(位操作)
标签:
原文地址:http://www.cnblogs.com/yanliang12138/p/4562528.html