摘要:二進制本身就是為這個數(shù)字而使用的,所以說這道面試題直指二進制的使用是沒錯的。正負在二進制中,第一位為的是負數(shù),是正數(shù)。
前言
使用PHP,給定一個數(shù),判斷這個數(shù)是否是二的N次方
這樣看似簡單的一個面試題, 實際牽出了很多基礎知識,本章在為大家補習基礎知識的情況下來解答這道題。先亮出答案
function exponentiation($number) { if ($number < 0) { return false; } if (($number & ($number - 1)) == 0) { return true; } else { return false; } } exponentiation (2); exponentiation (8); exponentiation (16); exponentiation (32); exponentiation (128);
這是查閱后的最最標準的答案,其他類似通過循環(huán)等等答案就略過把。
運算實際這道面試題考的并非是算法,而是作為開發(fā)人員的你“底子”夠不夠。
運算符應該是每門語言hello world 后立馬要學習的。運算符分很多種,賦值運算符,比較運算符等等。我想大多自學或者培訓出道的沒有經過系統(tǒng)化學習的童鞋的,對這塊的知識應該很薄弱把。當然賦值、比較什么的很熟悉,因業(yè)務基本逃不過這些。但對位運算符,你真的吃透了嗎?
這道題的考點一是位運算符的使用,上面說過了本題考察的并非算法,而是你對二進制的了解,而在php中能操作二進制的運算符貌似 (我的知識范圍內) 只有位運算符PHP位運算符 (部分)
本道面試題用到了 & 所以不詳解其他的運算符,需要更多了解請移步官方
http://php.net/manual/zh/lang...
運算符 | 附加信息 |
---|---|
& | 按位與運算符 |
^ | 按位異或運算符 |
按位與以簡單易懂的方式來講就是二進制位不相同的抵消,相同的保留
舉幾個栗子
公式 -> 轉為二進制后的公式 -> 二進制結果 -> 十進制結果
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進制
借用百度百科上的一段話
二進制是計算技術中廣泛采用的一種數(shù)制。二進制數(shù)據是用0和1兩個數(shù)碼來表示的數(shù)。它的基數(shù)為2,進位規(guī)則是“逢二進一”,借位規(guī)則是“借一當二”。
二進制本身就是為2這個數(shù)字而使用的,所以說這道面試題直指二進制的使用是沒錯的。2的n次方則就是
n | 公式 | 結果 |
---|---|---|
1 | 2 | 2 |
2 | 2x2 | 4 |
3 | 2x2x2 | 8 |
4 | 2x2x2x2 | 16 |
換算成二進制的表格是
n | 公式 | 結果 |
---|---|---|
1 | 2 | 000010 |
2 | 2x2 | 000100 |
3 | 2x2x2 | 001000 |
4 | 2x2x2x2 | 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個二進制進行運算時,計算機會統(tǒng)一位數(shù),例如
01 011 <------> 001 011
計算機會將01自動補一位為001去方便運算。
正負在二進制中,第一位為1的是負數(shù),0是正數(shù)。如果沒有補零的情況下
10000000000 01111111111
雖然計算后也是0,但它并不是2的n次方,因為第一組二進制是負數(shù)。
補充由上述題補充的另外一道題
給定任意數(shù),計算是2的幾次方?
function power($number){ if ($number < 0) { return false; } if (($number & ($number - 1)) == 0) { // 數(shù)學不好的,就看下面的方法 // $number = decbin($number); // return (mb_strlen($number)-1); // 數(shù)學可以的就看下面的方法 return floor(log($number,2)); } else { return false; } }
判斷是否是2的n次方
如果是則將十進制數(shù)字轉為二進制
計算總長度-1獲取到是2的幾次方,按照0的個數(shù)來計算
致謝感謝你看到這里,我也是文中提起的沒好好學基礎的一名程序員,但當你看到我這篇文章后,希望你也可以提起精神,去重溫下基礎,對你未來的職業(yè)生涯會起作用的。本章內容純屬自己理解,如有出入,請大佬們監(jiān)督批評,謝謝
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29078.html
摘要:一基礎接口的意義百度規(guī)范擴展回調抽象類的意義想不想通過一線互聯(lián)網公司面試文檔整理為電子書掘金簡介谷歌求職記我花了八個月準備谷歌面試掘金原文鏈接翻譯者 【面試寶典】從對象深入分析 Java 中實例變量和類變量的區(qū)別 - 掘金原創(chuàng)文章,轉載請務必保留原出處為:http://www.54tianzhisheng.cn/... , 歡迎訪問我的站點,閱讀更多有深度的文章。 實例變量 和 類變量...
摘要:另一個問題,就是我下面要提及的作用域問題,我當時思考的時間太久了這是回憶中的面試題實際略有差異,不糾結了說一下腳本的運行結果引用錯誤中給出的錯誤提示。 版權聲明:此文首發(fā)于我的簡書賬號人生還有多少個二十年,轉載請注明出處。 此處有幾百字嘮叨: 當天,我早早起床,跨越上百公里,高德導航,路人指點,跌跌撞撞到達招聘會現(xiàn)場,當時已是中午十二點半,吃了午餐(半瓶白開水),開始準備投遞...
閱讀 3234·2021-11-18 10:02
閱讀 1936·2021-09-22 10:54
閱讀 2989·2019-08-30 15:43
閱讀 2576·2019-08-30 13:22
閱讀 1575·2019-08-29 13:57
閱讀 1041·2019-08-29 13:27
閱讀 731·2019-08-26 14:05
閱讀 2512·2019-08-26 13:30