摘要:二進(jìn)制本身就是為這個(gè)數(shù)字而使用的,所以說(shuō)這道面試題直指二進(jìn)制的使用是沒(méi)錯(cuò)的。正負(fù)在二進(jìn)制中,第一位為的是負(fù)數(shù),是正數(shù)。
前言
使用PHP,給定一個(gè)數(shù),判斷這個(gè)數(shù)是否是二的N次方
這樣看似簡(jiǎn)單的一個(gè)面試題, 實(shí)際牽出了很多基礎(chǔ)知識(shí),本章在為大家補(bǔ)習(xí)基礎(chǔ)知識(shí)的情況下來(lái)解答這道題。先亮出答案
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);
這是查閱后的最最標(biāo)準(zhǔn)的答案,其他類(lèi)似通過(guò)循環(huán)等等答案就略過(guò)把。
運(yùn)算實(shí)際這道面試題考的并非是算法,而是作為開(kāi)發(fā)人員的你“底子”夠不夠。
運(yùn)算符應(yīng)該是每門(mén)語(yǔ)言hello world 后立馬要學(xué)習(xí)的。運(yùn)算符分很多種,賦值運(yùn)算符,比較運(yùn)算符等等。我想大多自學(xué)或者培訓(xùn)出道的沒(méi)有經(jīng)過(guò)系統(tǒng)化學(xué)習(xí)的童鞋的,對(duì)這塊的知識(shí)應(yīng)該很薄弱把。當(dāng)然賦值、比較什么的很熟悉,因業(yè)務(wù)基本逃不過(guò)這些。但對(duì)位運(yùn)算符,你真的吃透了嗎?
這道題的考點(diǎn)一是位運(yùn)算符的使用,上面說(shuō)過(guò)了本題考察的并非算法,而是你對(duì)二進(jìn)制的了解,而在php中能操作二進(jìn)制的運(yùn)算符貌似 (我的知識(shí)范圍內(nèi)) 只有位運(yùn)算符PHP位運(yùn)算符 (部分)
本道面試題用到了 & 所以不詳解其他的運(yùn)算符,需要更多了解請(qǐng)移步官方
http://php.net/manual/zh/lang...
運(yùn)算符 | 附加信息 |
---|---|
& | 按位與運(yùn)算符 |
^ | 按位異或運(yùn)算符 |
按位與以簡(jiǎn)單易懂的方式來(lái)講就是二進(jìn)制位不相同的抵消,相同的保留
舉幾個(gè)栗子
公式 -> 轉(zhuǎn)為二進(jìn)制后的公式 -> 二進(jìn)制結(jié)果 -> 十進(jìn)制結(jié)果
2 & 3 -> 0010 & 0011 -> 0010 = 2 10 & 7 -> 1010 & 0111 -> 0010 = 2 32 & 70 -> 0100000 & 1000110 -> 0000000 = 0按位異或
按位異或以簡(jiǎn)單易懂的方式來(lái)講就是二進(jìn)制位相同的抵消,不相同的保留
舉幾個(gè)栗子
公式 -> 轉(zhuǎn)為二進(jìn)制后的公式 -> 二進(jìn)制結(jié)果 -> 十進(jìn)制結(jié)果
2 ^ 3 -> 0010 ^ 0011 -> 0001 = 1 10 ^ 7 -> 1010 ^ 0111 -> 1101 = 13 32 ^ 70 -> 0100000 ^ 1000110 -> 1100110 = 102進(jìn)制
借用百度百科上的一段話
二進(jìn)制是計(jì)算技術(shù)中廣泛采用的一種數(shù)制。二進(jìn)制數(shù)據(jù)是用0和1兩個(gè)數(shù)碼來(lái)表示的數(shù)。它的基數(shù)為2,進(jìn)位規(guī)則是“逢二進(jìn)一”,借位規(guī)則是“借一當(dāng)二”。
二進(jìn)制本身就是為2這個(gè)數(shù)字而使用的,所以說(shuō)這道面試題直指二進(jìn)制的使用是沒(méi)錯(cuò)的。2的n次方則就是
n | 公式 | 結(jié)果 |
---|---|---|
1 | 2 | 2 |
2 | 2x2 | 4 |
3 | 2x2x2 | 8 |
4 | 2x2x2x2 | 16 |
換算成二進(jìn)制的表格是
n | 公式 | 結(jié)果 |
---|---|---|
1 | 2 | 000010 |
2 | 2x2 | 000100 |
3 | 2x2x2 | 001000 |
4 | 2x2x2x2 | 010000 |
由此看出2的n次方的二進(jìn)制最高位是1,其余補(bǔ)0,(n&(n-1))==0 并且 n> 0 的情況下必定是2的n次方,為什么要-1呢?在二進(jìn)制中每一位必須都不相同&后才會(huì)得出0,上述已經(jīng)講解了&的運(yùn)算結(jié)果。例如十進(jìn)制的16
16 & (16 - 1) = 010000 & (001111) = 0
不要糾結(jié)(n&(n-1))==0 這個(gè)公式是怎么來(lái)的,作為程序員,我感覺(jué)應(yīng)該把更多時(shí)間放到反推上面來(lái),去應(yīng)證這個(gè)公式的正確性。
驗(yàn)證是否是2的n次方,笨的方法就是一直除2,除到最后等于0則就是2的次方,所以公式如上補(bǔ)位
如果是2個(gè)二進(jìn)制進(jìn)行運(yùn)算時(shí),計(jì)算機(jī)會(huì)統(tǒng)一位數(shù),例如
01 011 <------> 001 011
計(jì)算機(jī)會(huì)將01自動(dòng)補(bǔ)一位為001去方便運(yùn)算。
正負(fù)在二進(jìn)制中,第一位為1的是負(fù)數(shù),0是正數(shù)。如果沒(méi)有補(bǔ)零的情況下
10000000000 01111111111
雖然計(jì)算后也是0,但它并不是2的n次方,因?yàn)榈谝唤M二進(jìn)制是負(fù)數(shù)。
補(bǔ)充由上述題補(bǔ)充的另外一道題
給定任意數(shù),計(jì)算是2的幾次方?
function power($number){ if ($number < 0) { return false; } if (($number & ($number - 1)) == 0) { // 數(shù)學(xué)不好的,就看下面的方法 // $number = decbin($number); // return (mb_strlen($number)-1); // 數(shù)學(xué)可以的就看下面的方法 return floor(log($number,2)); } else { return false; } }
判斷是否是2的n次方
如果是則將十進(jìn)制數(shù)字轉(zhuǎn)為二進(jìn)制
計(jì)算總長(zhǎng)度-1獲取到是2的幾次方,按照0的個(gè)數(shù)來(lái)計(jì)算
致謝感謝你看到這里,我也是文中提起的沒(méi)好好學(xué)基礎(chǔ)的一名程序員,但當(dāng)你看到我這篇文章后,希望你也可以提起精神,去重溫下基礎(chǔ),對(duì)你未來(lái)的職業(yè)生涯會(huì)起作用的。本章內(nèi)容純屬自己理解,如有出入,請(qǐng)大佬們監(jiān)督批評(píng),謝謝
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/29078.html
摘要:一基礎(chǔ)接口的意義百度規(guī)范擴(kuò)展回調(diào)抽象類(lèi)的意義想不想通過(guò)一線互聯(lián)網(wǎng)公司面試文檔整理為電子書(shū)掘金簡(jiǎn)介谷歌求職記我花了八個(gè)月準(zhǔn)備谷歌面試掘金原文鏈接翻譯者 【面試寶典】從對(duì)象深入分析 Java 中實(shí)例變量和類(lèi)變量的區(qū)別 - 掘金原創(chuàng)文章,轉(zhuǎn)載請(qǐng)務(wù)必保留原出處為:http://www.54tianzhisheng.cn/... , 歡迎訪問(wèn)我的站點(diǎn),閱讀更多有深度的文章。 實(shí)例變量 和 類(lèi)變量...
摘要:一面應(yīng)該還問(wèn)了其他內(nèi)容,但是兩次面試多線程面試問(wèn)題和答案采訪中,我們通常會(huì)遇到兩個(gè)主題采集問(wèn)題和多線程面試問(wèn)題。多線程是關(guān)于并發(fā)和線程的。我們正在共享重要的多線程面試問(wèn)題和答案。。 2016 年末,騰訊,百度,華為,搜狗和滴滴面試題匯總 2016 年未,騰訊,百度,華為,搜狗和滴滴面試題匯總 【碼農(nóng)每日一題】Java 內(nèi)部類(lèi)(Part 2)相關(guān)面試題 關(guān)注一下嘛,又不讓你背鍋!問(wèn):Ja...
摘要:一面應(yīng)該還問(wèn)了其他內(nèi)容,但是兩次面試多線程面試問(wèn)題和答案采訪中,我們通常會(huì)遇到兩個(gè)主題采集問(wèn)題和多線程面試問(wèn)題。多線程是關(guān)于并發(fā)和線程的。我們正在共享重要的多線程面試問(wèn)題和答案。。 2016 年末,騰訊,百度,華為,搜狗和滴滴面試題匯總 2016 年未,騰訊,百度,華為,搜狗和滴滴面試題匯總 【碼農(nóng)每日一題】Java 內(nèi)部類(lèi)(Part 2)相關(guān)面試題 關(guān)注一下嘛,又不讓你背鍋!問(wèn):Ja...
摘要:另一個(gè)問(wèn)題,就是我下面要提及的作用域問(wèn)題,我當(dāng)時(shí)思考的時(shí)間太久了這是回憶中的面試題實(shí)際略有差異,不糾結(jié)了說(shuō)一下腳本的運(yùn)行結(jié)果引用錯(cuò)誤中給出的錯(cuò)誤提示。 版權(quán)聲明:此文首發(fā)于我的簡(jiǎn)書(shū)賬號(hào)人生還有多少個(gè)二十年,轉(zhuǎn)載請(qǐng)注明出處。 此處有幾百字嘮叨: 當(dāng)天,我早早起床,跨越上百公里,高德導(dǎo)航,路人指點(diǎn),跌跌撞撞到達(dá)招聘會(huì)現(xiàn)場(chǎng),當(dāng)時(shí)已是中午十二點(diǎn)半,吃了午餐(半瓶白開(kāi)水),開(kāi)始準(zhǔn)備投遞...
摘要:寫(xiě)在前面這道題是本人在面試一家公司時(shí)的一個(gè)簡(jiǎn)單的基礎(chǔ)問(wèn)題,公司就不透露了,算是國(guó)內(nèi)很有名的公司,本人面試的只是實(shí)習(xí)崗位。 寫(xiě)在前面 這道題是本人在面試一家公司時(shí)的一個(gè)簡(jiǎn)單的基礎(chǔ)問(wèn)題,公司就不透露了,算是國(guó)內(nèi)很有名的公司,本人面試的只是實(shí)習(xí)崗位。一些大的問(wèn)題就不再說(shuō)了,每個(gè)人遇到的可能都是不一樣的,基本會(huì)圍繞著我們平常所常用的東西來(lái)聊,下面就說(shuō)一道小題: 題目 寫(xiě)出下面幾個(gè)表達(dá)式的結(jié)果:...
閱讀 3255·2021-11-18 10:02
閱讀 1960·2021-09-22 10:54
閱讀 2997·2019-08-30 15:43
閱讀 2588·2019-08-30 13:22
閱讀 1586·2019-08-29 13:57
閱讀 1055·2019-08-29 13:27
閱讀 746·2019-08-26 14:05
閱讀 2532·2019-08-26 13:30