题目:确定一个数字是否为 2 的幂
方法一:利用二进制
确定一个数字 n
是否为2的幂的一个有效方法是使用位操作。如果一个数是2的幂,那么它的二进制表示中必定有且仅有一位为1,且这一位在最高位。那么我们用其减去1的结果(所有高位为0,该位及其以下位为1)进行位与操作,结果必然为0。
#include <bits/stdc++.h>
using namespace std;
bool isPowerOfTwo(int n) {
if (n <= 0) return false;
return (n & (n - 1)) == 0;
}
int main() {
int num;
cin >> num;
if(isPowerOfTwo(num)) {
cout << "YES";
} else {
cout << "NO";
}
return 0;
}
在这段代码中,我们定义了一个名为 isPowerOfTwo
的函数,用来判断输入的数 n
是否为2的幂。我们首先检查 n
是否为非正数,如果是,直接返回 false
(因为负数和0不可能是2的幂)。然后再对 n
和 n-1
进行位与操作,结果如果为0,说明 n
是2的幂;否则,n
就不是2的幂。
然后在 main
函数中,我们从用户读入一个数,然后调用 isPowerOfTwo
函数判断这个数是否为2的幂,然后输出相应的提示信息。
其中“(n & (n - 1)) == 0”
代表:位与操作,在这个操作中,n
与 n - 1
的每一个对应的二进制位都进行与操作。即当且仅当两个对应位都为1时结果才为1,否则为0。
假设 n
是8,它的二进制表达是 1000,n - 1
就是7,二进制表达是 0111。进行位与操作,结果就是 0000,也就是0。
所以,(n & (n - 1)) == 0
若返回 true
,说明 n
的二进制形式只有一个1,从而 n
是2的幂。
方法二:利用pow函数
在C++中,pow
函数是计算数学幂的函数,被定义在 <cmath>
库中。
函数原型为:double pow(double base, double exponent)
,其中 base
是底数,exponent
是指数。这个函数返回 base
的 exponent
次幂的结果。
比如 pow(2,3)
会返回8,因为2的3次幂等于8。
#include<bits/stdc++.h>
using namespace std;
int main()
{
// 请在此输入您的代码
long long n;
cin>>n;
for(int i=0;i<30;i++)
{
if(n==pow(2,i))
{
cout<<"YES";
return 0;
}
}
cout<<"NO";
return 0;
}