問題描述:判斷一個整數 n 是否為 2 的冪次方


一、2的冪次方的基本定義

什么樣的數為2的冪次方?例如2^0=1,2^1=2,2^2=4……,符合公式2^n(n>=0)的數稱為2的冪次方。

如何判斷一個數是否為2的冪次方呢?基本思路:把一個數不斷的除以2,得到商與余數,若余數等於1,則這個數必然不是;若余數大於1,則繼續除以2,直到商等於1。若商等於1且余數為0,則這個數為2的冪次方。

 

二、2的冪次方的判斷方法

1:把一個數不斷的除以2,得到商與余數,若余數等於1,則這個數必然不是;若余數大於1,則繼續除以2,直到商等於1。若商等於1且余數為0,則這個數為2的冪次方。代碼如下: 1 /// <summary>

 1         /// <summary>
 2         /// 判斷一個整數 n 是否為 2 的冪次方
 3         /// </summary>
 4         /// <param name="n">需要判斷的整數n</param>
 5         /// <returns>true:整數n是2的冪次方;false:整數n不是2的冪次方</returns>
 6         static bool IsPower(int n)
 7         {
 8             while (true)
 9             {
10                 //0是2^0
11                 if (n == 0) return true;
12 
13                 int quotient = n / 2;//
14                 int remainder = n % 2;//余數
15 
16                 //余數等於1,則這個數必然不是
17                 if (remainder == 1) return false;
18 
19                 //商等於1且余數等於0,則這個數必然是
20                 if (quotient == 1 && remainder == 0) return true;
21 
22                 n = n / 2;
23             }
24         }

 

2: 把一個數n拆成二進制看待處理的,如果 n 是 2 的冪次方的話,那么 n 的二進制數的最高位是 1,后面的都是 0。如果我們把它減 1,則會導致最高位變成 0,其余全部變成 1。然后我們把 n 和 (n - 1)進行與操作,結果就會是 0。例如:16=1 0000,(1 0000 & 0 1111)=0。代碼如下:

1         /// <summary>
2         /// 判斷一個整數 n 是否為 2 的冪次方
3         /// </summary>
4         /// <param name="n">需要判斷的整數n</param>
5         /// <returns>true:整數n是2的冪次方;false:整數n不是2的冪次方</returns>
6         static bool IsPower(int n)
7         {
8             return (n & (n - 1)) ==0;
9         }

 

 三、總結

從運算性能上來說,首選n & (n - 1)的判斷方式,一行代碼即可解決2的冪次方的判斷。


免責聲明!

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



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