一、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的冪次方的判斷。
