第五百四十八章 技術(shù)宅
今天一章,明天補上。
周圍的每一寸空間似乎都堆放著各式各樣的電子設(shè)備和元器件,光線昏暗,擁擠不堪,林鴻覺得自己仿佛來到了大陸某個城市中城隍廟的電子市場。
走了一段路程之后,他看到,和電腦有關(guān)的電子配件和元器件逐漸多了起來。
前面,一個前額劉海染成黃色的青年正在店鋪中玩著電腦游戲。
這個時候,走在前面的黃越突然站住了,他轉(zhuǎn)頭對廣永元道:“按照老規(guī)矩。”
說完,他便獨自一人先朝前面走了。
“老規(guī)矩?”林鴻用疑惑地眼神看了廣永元一眼。
廣永元只好解釋道:“要想進入這個圈子,必須證明自己的技術(shù)已經(jīng)達到這個水平。雖然他們都認(rèn)識我,但他們都是死腦筋,只認(rèn)技術(shù)不認(rèn)人。”
繞來繞去,林鴻總算明白,要想繼續(xù)向前走,他必須通過他們設(shè)置的考驗,頗有點闖關(guān)的意味。
“有意思。”林鴻笑笑,對此并不在意,問道,“都有些什么項目?”
廣永元道:“編程、破解以及網(wǎng)絡(luò)滲透。當(dāng)然,并不一定要全部過關(guān),只要其中一項能夠得到他們的認(rèn)可就行了。你肯定是沒有問題的,只是走個過場罷了。”
廣永元已經(jīng)見識過林鴻的破解技術(shù),連《英雄無敵》這樣難啃的骨頭林鴻都三下五除二不費什么力氣就搞定了,更何況是他們的入門考驗?
這個時候,之前正在玩游戲的染發(fā)青年已經(jīng)退出游戲,他一甩額頭的黃發(fā)對林鴻道:“請吧。”
第一道關(guān)卡,編程。
林鴻也沒有什么廢話,坐到了剛剛青年的座位,他看到,顯示器中已經(jīng)出現(xiàn)了一道題目很顯然,他們對于這種事情已經(jīng)非常熟悉,擁有了自己一套固定的考驗流程。
給林鴻出的題目為“使用基本運算來編寫一個你所可能實現(xiàn)的效率最高的平方根函數(shù)”。
平方根在數(shù)學(xué)中是一個非常重要同時也非常復(fù)雜的運算,在計算機中實現(xiàn)這種函數(shù)通常比較困難,所以編程語言一般都會對這些函數(shù)進行封裝,程序員在編程的時候,如果涉及到平方根運算,直接調(diào)用函數(shù)庫中的函數(shù)就行了很少有人會懂得底層到底是如何實現(xiàn)的。
而且,能夠?qū)崿F(xiàn)是一方面,能不能做到運算效率高效又是另外一方面。
程序的運行效率,往往就是高手和菜鳥之間的重要區(qū)別,真正的黑客,編程的時候,不僅僅只是將功能實現(xiàn),還會追求最高效率有時候可能只是一個符號的變化,其執(zhí)行效率便天差地別。
執(zhí)行一次的區(qū)別可能看不出來,可是如果循環(huán)一千次,一萬次呢?
高手和菜鳥編寫的程序,在效率上往往有著很多倍的差距,要想編寫出高效優(yōu)雅的程序必須有著對編程語言和計算機底層的本質(zhì)理解,同時還得擁有豐富的編程經(jīng)驗,在這方面可做不得假實踐是唯一提高自身實力的方式。
林鴻知道,求平方根的運算,有一個算法叫做牛頓迭代法,其原理為:如果一個數(shù)為x,假設(shè)它的平方根為y如果y的平方和x相差大于某個給定的誤差′就繼續(xù)假設(shè)下一個值,如此持續(xù)下去直到最終得到在允許誤差內(nèi)的值。
至于如何假設(shè)這個值,使用的方式便是取平均值其中必須多次用到除法和乘法。
在計算機中,其本質(zhì)其實就是加法,整個cpu的運算其實就是一個加法器,當(dāng)初林鴻實現(xiàn)超腦cpu結(jié)構(gòu)的時候,就是基于一個加法器結(jié)構(gòu),至于后面的減法、乘法以及除法等運算,都是對在這個加法器的基礎(chǔ)上衍伸而來。
直接使用牛頓迭代法來求平方根,這是普通人的做法,林鴻不用想都知道,如果真的按照這種方式來實現(xiàn),顯然不能過關(guān)。
林鴻略微一思索便有了頭緒,他查看了一下電腦中的編譯器,發(fā)現(xiàn)這臺電腦里面準(zhǔn)備得非常充分,不但有市面上常見的一些編程語言編譯器,如c、baisc、java、c++等語言,甚至還有一些非常小眾的編程語言,如ada、blue、isp等等。
最終,林鴻還是調(diào)出了電腦中的c語言編譯器,直接敲起代碼來。
霹靂啪啦,僅僅過了二十來秒之后,林鴻便完成了函數(shù)的編寫。
他調(diào)用用函數(shù)執(zhí)行了一下,程序成功運行,沒有任何地錯誤,一次通過。
想了想,他再次刪掉了兩行,將兩個步驟合并成了一個,最終的函數(shù)代碼總數(shù)正好為十行。
“好了。”林鴻道。
站在他身后的廣永元此刻還在皺著眉頭看著他的程序。
他想不通,林鴻為什么這么編寫。
“這么快就好了?”染發(fā)青年有些詫異。
剛剛他讓出座位的時候,便從一個角落拿出了一個掌上游戲機玩了起來,可是剛剛才開始玩,便聽到林鴻說已經(jīng)ok。
這在眾多挑戰(zhàn)者當(dāng)中,還是頭一回。
染發(fā)青年俯身過去看了一眼,臉上微微一愣,林鴻寫的這十行代碼,雖然他能看懂大部分,但是還有幾個細節(jié)他一時之間也沒弄懂。
他順手將林鴻的這個函數(shù)加入時間統(tǒng)計宏,執(zhí)行一萬次之后,最終顯示出了時間,965毫秒,也就是說,不到一秒鐘。
他用敬服的眼神看著林鴻,說道:“你過關(guān)了。我在這里呆了兩年了,兩年來,從這里走過的人不下五十人,可是從來沒有一個人做到你這一步,不但結(jié)果保證精度,并且執(zhí)行一萬次的時間不超過一秒。”
林鴻笑笑,對于他的夸贊并沒有什么可得意的,這些都是最基礎(chǔ)的東西,只要理解了cpu的運作,多想一想基本上應(yīng)該都能達到的,沒有好得意的。
廣永元這個時候出言問道:“阿鴻,我看得不是很懂,求平方根不是使用二分查找法么?”
廣永元最擅長的并不是這個方面,他畢竟是野路子出身,基礎(chǔ)部分還不是很扎實,林鴻的這十行代碼,他竟然看得滿頭霧水。
他口中所說的二分查找,其實就是牛隊迭代法的實現(xiàn)方式之一。
林鴻點點頭:“算法的確是這個,不過在這里,我使用二進制的移位代替了乘除。你看……”
林鴻見他聽得不是很懂,于是便重新調(diào)出編譯器,下斷點,跟蹤變量的內(nèi)存賦值,一邊操作一邊解釋:“在二進制層面上,從前向后決定每一個二進制位上是0還是1,因此,我們可以從最高位向最低位,依次上1,看乘積結(jié)果是否大于目標(biāo)數(shù),如果大于目標(biāo)數(shù)了,那一位就保留0這樣的情況下,我們上1就不用真的去計算乘法,而是將之前的結(jié)果,加上上1以前的數(shù)左移1所在位置那么多位的兩倍,再加上上1的位置左移上1的位置……”
經(jīng)過林鴻演示加解說,廣永元這才恍然大悟,后面的青年也釋然的點點頭,他雖然知道大致原理,可是在細節(jié)方面還是有些地方?jīng)]有理解,聽了林鴻完整的解釋這才了然。
也就是說,整個算法林鴻使用的都是二進制層面的運算,想不快都難,或者說,沒有哪個程序可以比他的這個算法實現(xiàn)更快了。
僅僅花了二十來秒的時間就搞定第一關(guān),并且答案如此優(yōu)秀,這可是之前從來沒有碰到過的。
林鴻本來還想著見識一下后面到底出什么題目,不過黃越在看到林鴻的這個程序之后,便直接宣布林鴻過關(guān)了,沒有必要再繼續(xù)闖關(guān)。
這個題目,實際上是黃越親自出的,他當(dāng)初給了一個標(biāo)準(zhǔn)答案,也是二進制層面的實現(xiàn),可是兩者相比之下,還是有著相當(dāng)大的差距。
這雖然是最基礎(chǔ)的東西,但正是這些東西最是能看清楚一個人的水平。
很顯然,林鴻在這方面要比黃越更強,更別說,廣永元之前對他說,林鴻還是一個破解大師。
最終,林鴻順利地進入了他們的大本營,也就是一個相當(dāng)大的大廳,不過在那里,擺了上十臺各種品牌的電腦和服務(wù)器,看上去反而覺得有些擁擠。
大廳之中,有不少人,都是年輕人,他們見來了新成員,有的鼓掌,有的吹口哨,表示歡迎,不過,也僅此而已,例行歡迎儀式過后,他們便再次將注意力放在了自己的電腦顯示器上。
黃越給林鴻重點介紹了兩個人,一個叫袁樂邦,一個胖得連腰都彎不下的胖子,有著彌勒佛一樣的笑臉,擅長的領(lǐng)域正是游戲破解,廣永元最想挖的人便是他。
另外一個是阮飛舟,帶著厚厚的黑框眼鏡,他擅長的是硬件破解,在他的桌子上,擺滿了各種電子元器件和最新的游戲機,包括sony的ps游戲機和任天堂的gba和nds系列游戲機。-
在阮飛舟的身上,林鴻看到了顧偉的影子。
他們這個地方,并不是公司,甚至連一個團隊都稱不上,只是基于興趣聚集在一起,黃越為他們免費提供場所,而這里是鴨寮街,任何電器和元器件都能很方便地在這里找到。
他們是一群為技術(shù)而癲狂的技術(shù)宅。
,