使用php,給定乙個數,判斷這個數是否是二的n次方這樣看似簡單的乙個面試題, 實際牽出了很多基礎知識,本章在為大家補習基礎知識的情況下來解答這道題。先亮出答案
function exponentiation($number)
if (($number & ($number - 1)) == 0) else }
exponentiation (2);
exponentiation (8);
exponentiation (16);
exponentiation (32);
exponentiation (128);
這是查閱後的最最標準的答案,其他類似通過迴圈等等答案就略過把。
實際這道面試題考的並非是演算法,而是作為開發人員的你「底子」夠不夠。
運算子應該是每門語言hello world 後立馬要學習的。運算子分很多種,賦值運算子,比較運算子等等。我想大多自學或者培訓出道的沒有經過系統化學習的童鞋的,對這塊的知識應該很薄弱把。當然賦值、比較什麼的很熟悉,因業務基本逃不過這些。但對位運算子,你真的吃透了嗎?
這道題的考點一是位運算子的使用,上面說過了本題考察的並非演算法,而是你對二進位制的了解,而在php中能操作二進位制的運算子貌似(我的知識範圍內) 只有位運算子本道面試題用到了 & 所以不詳解其他的運算子,需要更多了解請移步官方
運算子附加資訊
&按位與運算子
^按位異或運算子
按位與以簡單易懂的方式來講就是二進位制位不相同的抵消,相同的保留
舉幾個栗子
公式 -> 轉為二進位制後的公式 -> 二進位制結果 -> 十進位制結果
2 & 3 -> 0010 & 0011 -> 0010 = 2
10 & 7 -> 1010 & 0111 -> 0010 = 2
32 & 70 -> 0100000 & 1000110 -> 0000000 = 0
按位異或以簡單易懂的方式來講就是二進位制位相同的抵消,不相同的保留
舉幾個栗子
公式 -> 轉為二進位制後的公式 -> 二進位制結果 -> 十進位制結果
2 ^ 3 -> 0010 ^ 0011 -> 0001 = 1
10 ^ 7 -> 1010 ^ 0111 -> 1101 = 13
32 ^ 70 -> 0100000 ^ 1000110 -> 1100110 = 102
二進位制是計算技術中廣泛採用的一種數制。二進位制資料是用0和1兩個數碼來表示的數。它的基數為2,進製規則是「逢二進一」,借位規則是「借一當二」。二進位制本身就是為2這個數字而使用的,所以說這道面試題直指二進位制的使用是沒錯的。2的n次方則就是n公式
結果122
22x243
2x2x284
2x2x2x2
16換算成二進位制的**是n公式
結果12000010
22x2
000100
32x2x2
001000
42x2x2x2
010000
由此看出2的n次方的二進位制最高位是1,其餘補0,(n&(n-1))==0 並且 n> 0 的情況下必定是2的n次方,為什麼要-1呢?在二進位制中每一位必須都不相同&後才會得出0,上述已經講解了&的運算結果。例如十進位制的16
16 & (16 - 1) =
010000 & (001111) = 0
不要糾結(n&(n-1))==0 這個公式是怎麼來的,作為程式設計師,我感覺應該把更多時間放到反推上面來,去應證這個公式的正確性。
驗證是否是2的n次方,笨的方法就是一直除2,除到最後等於0則就是2的次方,所以公式如上如果是2個二進位制進行運算時,計算機會統一位數,例如
01
011
001011
計算機會將01自動補一位為001去方便運算。
在二進位制中,第一位為1的是負數,0是正數。如果沒有補零的情況下
10000000000
01111111111
雖然計算後也是0,但它並不是2的n次方,因為第一組二進位制是負數。
由上述題補充的另外一道題
給定任意數,計算是2的幾次方?
function power($number)
if (($number & ($number - 1)) == 0) else
}
判斷是否是2的n次方
如果是則將十進位制數字轉為二進位制
計算總長度-1獲取到是2的幾次方,按照0的個數來計算
感謝你看到這裡,我也是文中提起的沒好好學基礎的一名程式設計師,但當你看到我這篇文章後,希望你也可以提起精神,去重溫下基礎,對你未來的職業生涯會起作用的。本章內容純屬自己理解,如有出入,請大佬們監督批評,謝謝?
一道看似簡單的面試題
使用php,給定乙個數,判斷這個數是否是二的n次方這樣看似簡單的乙個面試題,實際牽出了很多基礎知識,本章在為大家補習基礎知識的情況下來解答這道題。先亮出答案 function exponentiation number if number number 1 0 else exponentiation...
一道簡單的面試題
設初始區間為seq0 0.0,1,0 產生乙個隨機數插入原來區間形成新區間seq1 假設產生0.7,則seq1 0.0,0.7,1.0 對seq1中的區間的子相鄰區間 如 0.0,0.7 和 0.7,1.0 取最大值,再次在此區間產生隨機數並插入.如此不斷重複。演算法很簡單,維護乙個鍊錶即可。每產生...
一道面試題
一道面試題 射擊運動員10發打中90環有多少種可能,請編寫程式計算出來,並列印出結果,0環和10環均有效。打中90環就是沒打中10環,所以打中90環跟打中10環的可能性是一樣的。然後開始遞迴狂打槍,一到10就記錄 if params i 10 在迴圈的控制中已經排除了大於10的可能性 i 10 pa...