如何判断一个数是否为2的整数幂(c++)

前言

妈呀,我画画简直是一坨,总感觉看着像盗的

某天,小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++)

相关推荐
库玛西2 小时前
深入浅出传输层:UDP 与 TCP 协议全景指南
linux·服务器·网络·c++·笔记·tcp/ip·udp
Chester_19998 小时前
CSP202203C.计算资源调度器
开发语言·数据结构·c++·蓝桥杯
EXI-小洲9 小时前
Java 操作 Word:字符串替换、图片插入、动态生成表格与API接口下载
java·开发语言·spring boot·word
会周易的程序员9 小时前
给 PLC 写一个字节码虚拟机:STVM 虚拟机架构设计
开发语言·c++·虚拟机·软plc·iec61131·stvm
机器视觉知识推荐、就业指导9 小时前
为什么老说“纯 Qt 没啥就业市场”?
开发语言·qt
telepan9 小时前
Qt 开发避坑与性能指南:如何优雅、安全地定义全局常量字符串?
开发语言·qt
小灰灰搞电子9 小时前
完全驾驭 Qt 与数据库:C++ ORM 框架 QxOrm 原理与实践指南
数据库·c++·qt
QT界面美化性能优化10 小时前
QT+AI:使用AI技术为QT应用程序赋能
c++·人工智能·qt·opencv·qt教程·qt6.3
m0_6952514910 小时前
Qt MaintenanceTool 使用国内镜像加速下载(超详细教程)
开发语言·qt
大衛說11 小时前
《Python 从入门到精通》系列总览与学习路线
开发语言·python·学习