最近看到两道面试题,用到了同一个为操作公式:XXXX1000&(XXXX1000-1)=XXXX0000。
1.输入一个数字判定该数字是否是2^N类型。
#include <iostream>
using namespace std;
bool func1(int a);
int main()
{
int ary[5]={9,16,57,256,1024};
for (int i=0;i<5;i++)
{
cout << func1(ary[i])<<endl;
}
return 1;
}
bool func1(int a)
{
bool t = (0==(a&(a-1)))?true:false; //这里一定要注意优先级==高于&
return t;
}
设计的复杂一点就是:找出一个数组中所有满足2^N类型的数字。
#include <iostream>
using namespace std;
int find(int a[],int len);
void main()
{
int a[]={1,2,3,5,7,8,16};
int len=sizeof(a)/sizeof(int);
cout<<find(a,len)<<endl;
}
int find(int a[],int len)
{
int i;
int count=0;
for(i=0;i<len;i++)
{
if(0==(a[i]&(a[i]-1)))
{ cout<<a[i]<<endl;
count++;}
}
return count;
}
2.给定一个整形值,求出该值二进制表示中为1的位数之和。例如7的二进制表示为0000111,输出为3。
#include <iostream>
using namespace std;
int func2(int a)
{
int count=0;
while(a!=0)
{
a=a&(a-1);
count++;
}
return count;
}
int main()
{
int ary[5]={9,16,57,256,1024};
for (int i=0;i<5;i++)
{
cout << func2(ary[i])<<endl;
}
return 1;
}