postbody" class="blogpost-body ">
判斷乙個正整數是否是2的整數冪(如4是2的2次方,返回true;5不是2的整數次冪,則返回false)。要求效能盡可能高。
第一種考慮(乘法)
建立乙個中間變數temp,初始值是1,然後進入乙個迴圈,每次迴圈都讓temp和目標值進行比較,如果相等,則說明目標是2的整數次冪,
如果不相等,則讓temp乘以2,繼續迴圈比較,直到temp的值大於目標整數時,說明整數不是2的整數次冪。
比如:18
1*2=2;2比18小繼續
2*2=4;4比18小繼續
4*2=8;8比18小繼續
8*2=16;16比18小繼續
16*2=32;32比18大退出迴圈,說明18不是2的整數冪。
如果目標整數的大小是n,則此方法迴圈次數是logn。
**如下:
code">
code*******">
code_copy">
publiccode*******">static
boolean is2power1(int
num)
temp = temp << 1;
//temp = temp * 2;
}return
false
; }
codecopy">
想一想,有沒有更好的辦法?
第二種考慮(除法)
2的整數次冪都能被2整除,所以進入乙個迴圈,讓目標對2求餘,如果有餘數,則目標不是2的整數次冪,
如果沒有餘數,然後目標賦值為目標除以2,直到目標小於1,當目標小於1的時候則說明明目標是2的整數次冪。
比如:18
18%2=0;18被2整除
18/2=9;目標賦值為9
9%2=1;9沒被2整除退出迴圈,說明18不是2的整數冪。
如果目標整數的大小是n,則此方法迴圈次數有可能是1,2,3,4,...logn次。
**如下:
code">
code*******">
code_copy">
publiccode*******">static
boolean is2power2(int
num)
//num = num / 2;
num = num >> 1;
}return
true
; }
codecopy">
再想一想,有沒有更好的辦法?
第三種考慮(位運算)
讓我們看看2的整數次冪轉成二進位制是什麼樣的
十進位制二進位制
是否為2的整數次冪
81000是16
10000是32
100000是64
1000000
是100
1100100
否 是不是發現了,如果乙個整數是2的整數次冪,那麼當它轉化成二進位制時,只有最高位是1,其它位都是0!如果把這2的整數次冪各自減去1,在轉換成二進位制,會是什麼樣呢?
十進位制二進位制
原數值減1
是否為2的整數次冪
81000
111是
1610000
1111是32
100000
11111是64
1000000
111111
是100
10000000
1111111
是 是不是發現了,2的整數冪減去1時,它的二進位制數字都變成1了!如果在加上&運算子會出現什麼結果呢?
十進位制二進位制
原數值減1
n&n-1
是否為2的整數次冪
81000
1110是16
10000
11110是
32100000
111110是
641000000
1111110是
10010000000
1111111
1100000
是 怎麼樣會寫**了嗎?
**如下:
public是不是很簡單,只要動用所學過的知識點,聯絡起來,乙個問題就迎刃而解!!!static
boolean is2power3(int
num)
巧妙判斷乙個數是否為2的整數次冪
package main import fmt 如何判斷乙個數是否為2的整數次冪 思路1.暴力破解 從1開始乘以2,迴圈並和目標值比較,當大約目標值則終止,顯然此方法效率非常低下 思路2.把乘以2改為移位運算,提高一點效率,還是沒有解決演算法的根本問題 思路3.通過轉換成二進位制觀察,為2的整數次冪...
面試 如何判斷乙個數是否為奇數?
最開始我寫的是 return num 2 1 但發現好像忘了負數.所以改為了 return num 2 0 我以為這就解決了問題,但我習慣性檢視答案時,卻發現答案用了乙個奇怪的方法 return i 1 1 這是啥東西,冷靜下來想了一會,哦哦哦.答案是直接當做二進位制進行了運算,因為二進位制狀態下,...
判斷乙個數是否為回文數
問題描述 輸入乙個數值判斷是否為回文數 回文數是指乙個像12321 123321這樣 對稱 的數 解題思路 將數值的各個位存放在陣列中,若陣列中元素左右對稱,則為回文數,反之不是 設定 left 陣列最左邊下標 right 陣列最右邊下標 首先判斷第乙個和最後乙個數值是否相等,若相等,left ri...