[算法]快速判斷一個數是否是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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM