关于判断一个数N是不是2的n 次幂我想了两个办法:
方法一(即笨办法):
思路:将N用2去循环试除,一直除到1为止,如果出现除不尽的情况,就不是2的n次方。
代码:
#include
<
iostream
>
using namespace std;
void main()
. {
long n;
while(1) //循环输入
. .{
cout<<"输入一个整数:";cin>>n;
while(abs(n)>1)
...{
long m;
m=n%2;
if(m==0)
n/=2;
else
...{
cout<<"no ";
break;
}
}
if(n==1)
cout<<"yes ";
else if(n==0)
cout<<"no ";
cout<<endl;
}
}
using namespace std;
void main()
. {
long n;
while(1) //循环输入
. .{
cout<<"输入一个整数:";cin>>n;
while(abs(n)>1)
...{
long m;
m=n%2;
if(m==0)
n/=2;
else
...{
cout<<"no ";
break;
}
}
if(n==1)
cout<<"yes ";
else if(n==0)
cout<<"no ";
cout<<endl;
}
}
分析:这个方法又是除法,又是余数,效率太低了。
方法二:将N与(N-1)进行按位与运算,结果为0,则N 为2的n 次幂,否则不是。
代码:
#include
<
iostream
>
using namespace std;
void main()
... {
long n;
while(1) //循环输入
...{
cout<<"输入一个整数:";cin>>n;
n=abs(n);
if(!(n & (n - 1)) & !!n )
cout<<"yes";
else cout<<"no";
cout<<endl;
}
}
using namespace std;
void main()
... {
long n;
while(1) //循环输入
...{
cout<<"输入一个整数:";cin>>n;
n=abs(n);
if(!(n & (n - 1)) & !!n )
cout<<"yes";
else cout<<"no";
cout<<endl;
}
}
分析:只用一个 !(n & (n - 1)) & !!n 作判断,效率高。