1. 程式人生 > >10.24程式設計師節專輯——程式設計師最愛的數字,1024的祕密

10.24程式設計師節專輯——程式設計師最愛的數字,1024的祕密

# 10月24日程式設計師節的由來   為什麼將每年的10月24日定為程式設計師節?1024程式設計師節是什麼梗?   因為計算機內部採用二進位制計算,為了計算方便,一般的計算機儲存容量單位(Byte、KB、MB等)的單位進率都是1024,它是2的10次方,又與我們常用的十進位制裡的1000十分接近,所以這個數字對於程式設計師來說有特殊意義。因此,中國的程式設計師日被定在10月24日。   1024是2的十次方,二進位制計數的基本計量單位之一,1024程式設計師節是中國程式設計師的共同節日。程式設計師就像是一個個1024,以最低調、踏實、核心的功能模組搭建起這個科技世界。另外,1G=1024M,而1G與1級諧音,也有一級棒的意思,因此每年的10月24日被大家定為程式設計師節,這也是一個屬於中國程式設計師的共同節日。   眾所周知,程式設計師是一個在外界看來很艱苦的一個工種,網路上甚至有這樣的段子:一女孩說擇偶的標準是程式設計師,原因是程式設計師“錢多話少死得早”。話糙理不糙,從這句話可以看出,常年與加班為伍的程式設計師,工作壓力有多大。你眼中的程式設計師可能是這樣一群人:常年如一日的格子衫著裝讓你倍感嫌棄又想吐槽?超長反射弧和超高笑點讓你經常冷場?略顯愚鈍木訥的舉止讓身邊的人覺得無聊又無趣……   他們經常讓外人覺得莫名其妙,甚至以“異類生物”,“程式猿”相稱呼。但是就是這樣一群人讓我們的生活悄然改變著,以最低調、踏實、核心的功能模組搭建起這個科技世界,讓我們感受著科技力量的偉大和生活的便捷。程式設計師就像是一個個1024,一步一個腳印,悄無聲息地為世界進步貢獻著自己的力量。   因此1024程式設計師節就被定義為關愛身邊每一位努力奮鬥的程式設計師的日子。   1024程式設計師節,為了讓程式設計師感受到身邊“關心和熱情”,不少網路公司都使出渾身解數。例如請來美女模特化身程式設計師鼓勵師,為程式設計師捏肩捶背加油吶喊。   也有發放程式設計師切身需要的福利:育發洗髮水。大家都知道,髮際線和禿頂已經似乎已經和格子衫一樣,成為了程式設計師的固定標配。   更"人性化"一點的公司,就直接給程式設計師放假了.......   當然,我們也希望各位老闆們發揚人道主義精神,堅決貫徹1024程式設計師節不加班的精神。也讓我們一起祈禱:希望在10月24日能無驚無險,這天小鮮肉們都別公佈戀情,明星們都別撕逼,讓程式設計師們痛痛快快的過個好節、約個會。   最後,程式設計師節程式設計師們可以寫寫技術文章,發發朋友圈和部落格,讓不善言語的程式設計師們裝逼指數瞬間上升!
# 1024的趣味解釋   1024+996=2020=404+404+404+404+404(今年是2020年,996,404是什麼意思你懂的) # 1024的數學性質   1024是1023與1025之間的自然數   1024是一個組成4個十進位制數字的最小平方數:$2^{10}$,它是32的平方:$32^2$   $2^{10}$(1024)的近似值是$10^3$(1000)   $\color{red}{1024}=2^{10}=4^5=32^2$   1024是合數,正約數有1、2、4、8、16、32、64、128、256、512和1024   1024的質因數分解為$2^{10}$。   1024是虧數,真約數和為1023,虧度為1。   1024是第32個平方數,為32的平方。前一個為961、下一個為1089。   1024是第9個十進位制的節儉數。前一個為729、下一個為1029。   正1024邊形為第54個可作圖多邊形。前一個為1020、下一個為1028。   在計算機中,8bit等於1Byte,1024Byte等於1KB,1024KB等於1MB,1024MB等於1GB,1024GB等於1TB,**因為記憶體二進位制定址的緣故,記憶體廠商生產記憶體時會嚴格遵循這一標準,但大多數硬碟廠商則使用1000作為換算單位,這一點需要注意。**   老式4:3顯示器解析度的長度通常為1024畫素(寬度為768畫素)。 # 和1024相似的數字   其實對於程式設計師而言,不僅僅只對1024這個數字很敏感,事實上,對於很多和2的整數次冪的數字,都有這種神奇的感覺,下面我們來看看1024的小夥伴們長什麼樣! ## 8   1Byte=8bit   年代久遠的8位計算機   8位資料型別(位元組整型(byte),字元型(char)) ## 16   16位計算機   一箇中文字元佔用16bit空間,即2Byte   16位資料型別(短整型(short int)) ## 32   32位計算機   32位資料型別(預設整型/長整型(int/long int),單精度浮點型(float))   IPv4協議的位數為32位(目前IPv4地址已經全部分配完) ## 64   64位計算機(最常見)   64位資料型別(超長整型(long long int),雙精度浮點型(double)) ## 127/128   有符號位元組整型可以表示的數的範圍是-128~127(128-1)   ASCII碼可以表示128種字元,範圍從0~127   MD5編碼通常為128位   IPv6協議的位數為128位 ## 255/256   無符號位元組整型可以表示的數的範圍是0~255(256-1)   擴充套件ASCII碼可以表示256種字元,範圍從0~255   常用的8位RGB顏色分量範圍是0~255 ## 512   老式硬碟的扇區大小為512位元組   老式硬碟MBR主引導記錄佔用一個扇區,大小為512位元組 ## 2048   著名益智消除小遊戲2048,其玩法是從2開始,每兩個相同數字的方塊可以合成出一個新的2倍大小數字的方塊,遊戲中體現了二進位制合成的思想,最後看誰能合成到2048,而且之後還可以繼續向更大數字挑戰 ## 4096   新型硬碟的扇區大小為4096位元組(4KB) ## 32767/32768   短整型可以表示的數的範圍是-32768~32767(32768-1) ## 65535/65536   無符號短整型可以表示的數的範圍是0~65535(65536-1)   16位色圖片(RGB565)可以表示65536種顏色 ## 1048576   1MB=1048576Byte ## 16777216   24位色圖片(RGB888,最常見的圖片)可以表示16777216種顏色 ## 1073741824   1GB=1073741824Byte ## 2147483647/2147483648   預設整型/長整型可以表示的數的範圍是-2147483648~2147483647(2147483648-1)(所以很多遊戲的經驗值/金幣上限是2147483647,當然也有使用無符號整型的上限是4294967295,此外,Unix時間戳用從1970年1月1日開始的時間秒數來記錄時間,因此在時間戳對應整數達到2147483647時,即格林尼治時間2038年1月19日凌晨03:14:07,北京時間:2038年1月19日中午11:14:07的時候,使用Unix時間的32位計算機應用程式將無法正常工作。)   FAT16格式分割槽的最大容量為2147483648Byte(2GB) ## 4294967295/4294967296   無符號(長)整型可以表示的數的範圍是0~4294967295(4294967296-1)(這也是一個很常見的上限)   FAT32格式分割槽單個檔案最大大小為4294967296Byte(4GB)   32位作業系統最大支援4294967296Byte(4GB)的記憶體   IPv4協議可以表示的地址數為4294967296(約42.9億,目前IPv4地址已經全部分配完) ## $2^{63}-1\ /\ 2^{63}$   超長整型可以表示的數的範圍是$-2^{63}\sim2^{63}-1$ ## $2^{64}-1\ /\ 2^{64}$   無符號超長整型可以表示的數的範圍是$0\sim2^{64}-1$   NTFS格式分割槽的理論最大容量為$2^{64}$Byte(16EB) ## $2^{128}$   IPv6協議可以表示的地址數為$2^{128}$(估計到宇宙毀滅也用不完) # 感覺中的1024   聽覺系統接收到的是聲波(機械波)資訊,機械波有振幅,波長,波速等要素,其中振幅反映波的強度,而波長決定了波的某些性質。和視覺系統一樣,人類只能接收一定波長範圍內的機械波,這一部分機械波稱作可聞聲(類比可見光)。   若用c表示聲速,則人類能接收到的機械波的波長範圍大約是$\frac{c}{20000}\sim\frac{c}{20}$(常溫下c的值大約為340m/s)。但是人類對機械波的感知通常是對數感知,即等比感知,波長的比值相等時,人類認為它們在聽覺上的距離也是相等的,用數學語言描述,就是當$\frac{λ_1}{λ_2}=\frac{λ_3}{λ_4}$時,1,2的距離和3,4的距離是相等的,兩邊取對數後,就是$log_aλ_1-log_aλ_2=log_aλ_3-log_aλ_4$,把原來的除法變成了減法,所以取對數後,反映的才是真正意義上的“距離”
。   如果兩個波波長的比值為1:2(或2:1),我們稱它們之間的距離為一個“八度”(octave),這裡的“八度”是借用了樂理上的術語,實際上就是兩倍關係的意思。   根據“八度”的定義,人類聽覺範圍大約是10個八度,由於$2^{10}=\color{red}{1024}$,也就是1024倍的波長範圍。這就是感覺中的1024的由來。   有的人可能會問,按照剛才給的資料,應該是1000倍啊。其實,這個範圍也只是大概的範圍,實際上會有些許誤差,加上剛才所說的對數感知問題,其實這裡的1000和1024在對數角度下差別已經很小了,之所以我要強調1024,也是為了強調人類的對數感知(10個八度),換算成倍數後,剛好是1024,這其實是挺神奇的一件事。   其實對數這個東西很神奇,從最短波長開始,波長每翻一倍,相當於降低了一個八度,聽起來也就更震撼一分,最後就變成“低音炮”了,超級震撼人心!我曾經把這種波長很長的聲音比作紅色
,就是這樣來的,因為它的波長最長,就和紅光一樣,而且它聽起來讓人興奮,心跳加速,很熱血,很激情的感覺!這不就和紅色給人的感覺是一模一樣的嗎?而且根據物理原理,這種波長很長的聲波穿透力是極佳的(也和紅光一樣),所以在大老遠都能很清楚地聽到。比如某輛車裡有人正在放歌的話,我在車外第一耳能聽到的就是低音炮的聲音!   但是人的眼睛看到的可見光只有差不多2倍的波長範圍($390*10^{-9}\sim780*10^{-9}\mathrm{m}$),比聲波(傳說中的1024倍)小多了。   不過我仍然認為人的視覺好於聽覺,畢竟人眼的細胞相當於可以分辨出10億多的畫素,而且可見光的2倍多的波長範圍中也包括了彩虹的七種顏色,所謂七彩繽紛吧!   而耳朵,呵呵,很多人都沒有音感,經常不對調,就算有,也很難有絕對音感(直接說出波長的能力),而且音質和音色這個問題,就更呵呵了,眾所周知,耳機和hifi圈子中的玄學都是這樣來的。   所以我認為,相比於視覺,人的聽覺還是要遜色一些,畢竟這個東西看不見也摸不著,是無形的,所謂眼見為實,耳聽為虛吧!當然,我們聽聲音,是為了滿足心理上的快樂的,而不是去玩玄學,搞出讓人云裡霧裡的言論的,如果是這樣的話,就違背了我們享受快樂的初衷了!
  人類的聽覺不光是對數的,而且還是“二進位制”的,這又和程式設計師扯上關係了!你可能會問,既然2倍波長是“八度”,那麼3倍,5倍是什麼呢?**其實一個很神奇的現象是,人類的聽覺特別“喜歡”整數比,尤其是小整數比**,所以人類認為2倍波長(八度)是非常“和諧”的,其實3倍,5倍也一樣“和諧”,但是不如2倍那麼的“和諧”,**所以2倍對於人類來說就是個很特別的比例了**,以至於我們專門找了一個詞“八度”去描述它,而3倍,5倍就沒有這樣的待遇了。一個值得注意的現象是,如果兩個音之間的距離是“八度”,那麼人類會認為它們是相似的音,3倍,5倍則沒有這樣的效果。所以我們也經常用2倍即“八度”作為對數座標上的一個單位去分析波長譜。這樣看來,就和二進位制就扯上關係了!   如果把某個特定的音用二進位制表示,將會得到意想不到的結果,而十進位制則做不到這一點,下面我們就一起來看看: |音名|C(上面加兩點)|B(上面加一點)|Bb(上面加一點)|A(上面加一點)|Ab(上面加一點)|G(上面加一點)|Gb(上面加一點)|F(上面加一點)|E(上面加一點)|Eb(上面加一點)|D(上面加一點)|Db(上面加一點)|C(上面加一點)| |--|--|--|--|--|--|--|--|--|--|--|--|--|--| |相對波長(十進位制)|1|1.059463|1.122462|1.189207|1.259921|1.334840|1.414214|1.498307|1.587401|1.681793|1.781974|1.887749|2| |相對波長(二進位制)|1|1.00001111001110010000|1.00011111010110011011|1.00110000011011111110|1.01000010100010100011|1.01010101101110000001|1.01101010000010011110|1.01111111100100010001|1.10010110010111111111|1.10101110100010100000|1.11001000001000111110|1.11100011010000111000|10|
|音名|C(上面加一點)|B|Bb|A|Ab|G|Gb|F|E|Eb|D|Db|C| |--|--|--|--|--|--|--|--|--|--|--|--|--|--| |相對波長(十進位制)|2|2.118926|2.244924|2.378414|2.519842|2.669680|2.828427|2.996614|3.174802|3.363586|3.563595|3.775498|4| |相對波長(二進位制)|10|10.0001111001110010000|10.0011111010110011011|10.0110000011011111110|10.1000010100010100011|10.1010101101110000001|10.1101010000010011110|10.1111111100100010001|11.0010110010111111111|11.0101110100010100000|11.1001000001000111110|11.1100011010000111000|100|   (由於精度原因,二進位制採用了較多的小數點位數進行表示)   從表中可以看出,從左到右波長依次增大,最後波長變為原來的2倍,即經過了一個“八度”,第二個表繼續按照這種方式進行下去。由於上下兩個表中每一對應列的波長比值均為1:2,所以人類會認為它們是兩個相似的音,因此我在這兩個表中所寫的音名其實是一樣的,只有“加點”的區別,而加的點就是為了區分不同的“八度“的。   如果按照十進位制表示,上面的表和下面的表的波長之間存在2倍的關係,但需要進行計算,**而如果按照二進位制表示,下面的表的波長僅僅只是向左移動了一位小數點,不需要任何額外的運算**。在二進位制表示波長的情況下,按照這種方式推導下去,我們甚至可以很容易地把接下來的一個表寫出來,逆向推導(波長減小)同理,只不過要把小數點移動方向變成向左移動。
  總結:如果把人類能感知到的機械波的最短波長用1表示,那麼它對應的第二個“八度”和第三個“八度”距離的相對波長在二進位制下就分別是10,100,在十進位制下就分別是2,4,到了最長波長的時候,那麼在二進位制下,相對的最長波長就是10000000000(1後面有10個0,即10個“八度”),在十進位制下,就是1024了!