一道看似簡單的面試題

2021-10-25 04:40:02 字數 2740 閱讀 9466

使用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...