前言
妈呀,我画画简直是一坨,总感觉看着像盗的
某天,小A的老师问了一个问题:

小A想了想
便说:

小A自信地开始写代码
小A:写好了
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
while((n>0)&&(n%2==0)){//枚举
n/=2;
}
if(n!=1){//不是的话就不是了
cout<<"no";
}else{
cout<<"yes";
}
}

小A懵逼了,啊?
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
while((n>0)&&(n%2==0)){//枚举
n>>1;
}
if(n!=1){//不是的话就不是了
cout<<"no";
}else{
cout<<"yes";
}
}
除了<<和>>能够提升效率外还有什么?

好吧,其实确实有O(1)的方法
我们先将十进制2的次方转为2进制
| 十进制 | 二进制 | 是否为2的整数幂 |
|---|---|---|
| 2 | 10 | 是 |
| 4 | 100 | 是 |
| 16 | 10000 | 是 |
| 100 | 1100100 | 否 |

没错,那么n-1的二进制又是什么?
7的二进制是111B
31的二进制是11111B
所以N&N-1的结果是0的数,N就是2的整数幂
这样子我们就可以得到时间复杂度只有O(1)的代码了

代码如下:
cpp
#include<bits/stdc++.h>
using namespace std;
int n;
int main(){
cin>>n;
if(n&(n-1)){
cout<<"no"<<endl;
}
else{
cout<<"yes"<<endl;
}
return 0;
}
我们还可以根据位运算衍生出很多题目
这里我出道题目,大家可以做做看:
求一个整数N转成二进制后"1"的个数
那么本期讲解就到这了
谢谢
.
...
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
完结?
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
撒花!
本期参考文献:
漫画:如何判断2的乘方
参考书籍:
信息学奥赛课课通(c++)