[算法]快速判断一个数是否是2的幂次方
1 #include<stdio.h> 2 #include<stdlib.h> 3 int main(void) 4 { 5 int Number; 6 scanf_s("%d", &Number); 7 if (0 == (Number & (Number - 1))) 8 { 9 printf("Success.\n"); 10 } 11 else 12 { 13 printf("Error.\n"); 14 } 15 system("pause"); 16 return 0; 17 }
利用与(&)运算符
可以快速判断一个数是否为2的幂次方
将2的幂次方写成二进制形式后,很容易就会发现有一个特点:二进制中只有一个1,并且1后面跟了N个0, 因此问题可以转化为判断1后面是否跟了N个0就可以了。
如果将这个数减去1后会发现,仅有的那个1会变为0,而原来的那n个0会变为1,因此将原来的数与去减去1后的数字进行与运算后会发现为零。
因此,最快速的方法是:
(Number & Number - 1) == 0
因为2的N次方换算是二进制为10……0这样的形式,与(&)上自己-1的数,这们得到结果为0。
例如:8的二进制为1000,8-1=7,7的二进制为111,两者相与的结果为0,计算如下:
(1000)&(111)=0000
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)