給定乙個整數,寫乙個函式判斷該函式是否為2的冪。
例如
輸入 16輸出 true
輸入:5輸出:false
bool ispoweroftwo
(int n)
bool ispoweroftwo
(int n)
由二進位制原理可以知道,如果乙個數為2的冪,那麼這個數對應的二進位制應該只有乙個1,
演算法1:
在計算機系統中負數通常以補碼的方式儲存,
7的8位二進位制為0000_0111
-7的8位二進位制為
1111_1001
7&(-7)的二進位制為 0000_0001
4的8位二進位制為
0000_0100
-4的8位二進位制為
1111_1100
4 &(-4)的二進位制位0000_0100
因此 x &(-x)將x的最右邊置為1,由於如果乙個數為2的冪,該數字對應的二進位制只有乙個1,因此可得
x&(-x) = x
該思路對應code2
演算法2:
依然從由於如果乙個數為2的冪,該數字對應的二進位制只有乙個1考慮,那麼可以得到
x&(x-1) = 0
例如4對應的二進位制為0000_0100
4-1對應的二進位制為
0000_0011
4 & (4-1)==0
7對應的二進位制為
0000_0111
7-1對應的二進位制位
0000_0110
7 & (7-1) != 0
該思路對應code1
判斷乙個數是否為2的次方冪
給定乙個整數n,判斷它是否為2的次方冪。思路 2,4,8,16,32.都是2的n次冪 轉換為二進位制分別為 10 100 1000 10000 100000 這些數減1後與自身進行按位與,如果結果為0,表示這個數是2的n次冪 01 011 0111 01111 011111 10 01 0 100 ...
巧妙判斷乙個數是否為2的整數次冪
package main import fmt 如何判斷乙個數是否為2的整數次冪 思路1.暴力破解 從1開始乘以2,迴圈並和目標值比較,當大約目標值則終止,顯然此方法效率非常低下 思路2.把乘以2改為移位運算,提高一點效率,還是沒有解決演算法的根本問題 思路3.通過轉換成二進位制觀察,為2的整數次冪...
判斷乙個數是否為 4 的冪(也可以是 2 的冪)
首先判斷是否為 2 的冪,因為 4 的冪均是 2 的冪 2 的冪 num 1,2,4,8,16,32 換成 2 進製即 1,10,100,1000,10000,100000,明顯可以得出 num num 0 4 的冪 num 1,4,16,64,換成二進位制即 1,100,10000,1000000...