[算法]快速判断一个数是否是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 @ 2020-04-08 21:28  MoKin_Li  阅读(2086)  评论(0编辑  收藏  举报