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