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
