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