[算法]快速判断一个数是否是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

posted @   MoKin_Li  阅读(2108)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示