程序员的数学思维修炼(趣味解读)还有哪些进制
其實,除了我們常用的十進制數和電腦用的二進制數之外,生活中還有很多的計數進
制,并且有很多的進制也在電腦中使用。
1.4.1????神奇的八卦:八進制
八卦最初是上古人們記事的符號,后被用為 卜筮符號,古代常用八卦圖作為除兇避災?的吉祥圖案。因此,八卦也就被打上了封建迷信的標記。
1?.從八卦說起
其實,八卦中隱含了二進制和八進制的概念。首先,八卦的最基本概念是陰和陽,這 就相當于二進制中的0和1 。在八卦圖中用一根長實線代表陽,用一根中間斷開的線代表??陰,然后由3個這樣的線條符號組成8種形式 (相當于3位二進制數,可以表示8種狀態) , 因此叫做八卦,如圖1-34所示。
?
圖1-34
在八卦中,每一卦形代表一定的事物。乾代表天、坤代表地、坎代表水、離代表火、?震代表雷、艮 (gèn) 代表山、巽 (xùn) 代表風、兌代表澤。
經過幾千年的發展,八卦被賦予了很多的含義,除了上面介紹的代表自然現象之外,?還可以代表方位、家族、五行,還可以將卦圖轉換為二進制數。如表1-2所示就是八卦中 各卦所代表的不同含義。
表1-2????八卦的含義
?
2?.一種計算方式:八進制
可以看出,八卦中的每一卦由3位二進制組成,這樣表示8種狀態的數據就是一種八進 制計數方法。當然,八進制計數不會使用八卦的方式來表示,更多的情況下是使用阿拉伯 數字來表示。
八進制計數法則主要有以下3個特點:
基數為8;
由8個數碼組成,分別是0 、1 、2 、3 、4 、5 、6 、7;
逢8進1 ,借1當8。
如表1-3所示是十進制數、八進制數和二進制數的對應關系。
表1-3????十進制數、八進制數、二進制數對應關系
?
續表
?
從表1-3中可看出,1位八進制數與3位二進制數相對應。
八進制計數法在早期的計算機系統中很常見,因此,偶爾我們還能看到人們使用八進 制表示法。八進制適用于12位和36位計算機系統 (或者其他位數為3的倍數的計算機系 ??統) 。但是,對于位數為2的冪 (8位、16位、32位與64位計算機系統) 的計算機系統來 ?說,八進制就不算很好了。因此,在過去幾十年里,八進制漸漸地淡出了電腦。不過,還 是有一些程序設計語言提供了使用八進制符號來表示數字的能力,而且還是有一些比較古 老的UNIX應用仍在使用八進制。
1.4.2????鐘表使用的十二進制
另一個我們常用的進制就是十二進制,如圖1-35所示的鐘表表面顯示為12個小時,即 每12小時繞一圈,又從0點開始。
?
圖1-35
歷史上,在很多古老文明中都使用十二進制來記數。這或許是由于一年中月球繞地球 轉12圈。在中國文化中,十二進制在記時中也有廣泛應用。中國古代設有12地支,與一天 的12個時辰對應。一個地支還對應2個節氣,從而表示1年的24節氣。同時,將地支與12種 動物對應,成為12生肖,表示12年為周期的循環。
十二進制在各種度量衡中也經常會用到。如英制單位中1英尺等于12英寸,金衡制中1 金衡磅等于12金衡盎司。
十二進制計數法的規則如下:
基數為12;
由12個數碼組成,分別是0 、1 、2 、3 、4 、5 、6 、7 、8 、9 、A 、B;
逢12進1 ,借1當12。
雖然十二進制在日常生活中很常用,不過,在計算機程序設計中使用的頻率倒不多,?反而是二進制、八進制、十進制、十六進制使用得要多一些。
1.4.3????半斤八兩:十六進制
再來看一個計算機中使用得很多的進制:十六進制。
在日常生活中,也有很多使用十六進制的地方。中國原來使用的重量單位就是十六進 制的,即16兩為1斤,這也就有了所謂的“半斤八兩”的說法了。
現在還在使用的磅和盎司這兩個重量單位也是采用十六進制的方式計數的,1磅等于 16盎司。
計算機中使用二進制可以很好地計數和運算,為什么還要使用十六進制呢?
在使用二進制書寫程序時,會發現有一個很麻煩的問題,要用二進制數表示一個比較 大的十進制數時會需要很多位的二進制位。例如,表示十進制的255?,就需要8位二進制??數,而表示65535這個十進制數,則需要16位二進制數。
?
在程序中要處理的數據經常會比65535大得多,那就需要使用二進制數的更多位數 ??了。對于很多位的二進制數,不但書寫困難,還容易出錯 (這么長一串,稍不注意就可能 輸入錯誤) 。
而使用十進制數又不方便與二進制數相對應,因此就引進了十六進制。
十六進制計數法的規則如下:
基數為16;
由16個數碼組成,分別是0 、1 、2 、3 、4 、5 、6 、7 、8 、9 、A 、B 、C 、D 、E 、F;?逢16進1 ,借1當16。
如表1-4所示是十進制數、十六進制數和二進制數的對應關系。
表1-4????十進制數、十六進制數、二進制數對應關系
?
續表
?
從表1-4中可看出,1位十六進制數與4位二進制數相對應。這樣,當程序員在編寫程 序時,若將數據按十六進制格式書寫,將大大縮短輸入數據的位數。例如,對于十進制數 255 ,用二進制表示需要8個1來表達 (即1111 ???1111) ,而用十六進制來表示,則只需要2?個F??(即FF) 。類似地,對于十進制數65535用二進制來表示需要16位,而用十六進制來 表示,則只需要4位。
?
1.4.4????60年一個甲子:六十進制
在中國,經常可以聽到“甲子”這個概念,這是農歷歷法中的一個概念,每60年為一個
甲子,以天干與地支兩者經一定的組合方式搭配成60對,為一個周期。
這就是六十進制的一種使用。
在現實生活中,使用六十進制的地方也很多。不過,與其他進位制不同,六十進制在 一般運算和邏輯中并不常用,主要用于計算角度、地理坐標和時間。
例如,1小時等于60分鐘,而1分鐘則為60秒。而1個圓可被均分成360度,每1度有60 角分,1角分等于60角秒。
六十進制在計算機程序中使用得很少。
1.4.5????各種進制之間的轉換
前面介紹二進制時,曾介紹了二進制數與十進制數之間的轉換方法:二進制數轉換為 十進制數時,將二進制數“按權展開” ,即可得到十進制數;而十進制數轉換為二進制數??時,使用“除2取余,逆序排列”即可。
類似地,其他進制的數轉換為十進制數時也可采用相似的方法,只是在“按權展 ?開”時,使用各進制的基數即可。因此,可得到其他進制轉換為十進制的統一按權展開 式:
?
在上面的統一算式中,D表示轉換后得到的十進制數,Xn-1為B進制中從右向左數第 n位數。例如,二進制數1101的按權展開式為:
?
而十六進制BC0D的按權展開式為:
?
如果要將十進制數轉換為B進制數,也可以采用除以基數B再取余的方法來求得,如 圖1-33所示,只是將除數由2改為B進制數的基數B即可。
只要能將任意數轉換為十進制數,然后又有將十進制數轉換為任意進制數的方法,通 過十進制數進行中轉,即可進行任意進制數之間的轉換了。使用這種思路可編寫出以下的
進制轉換程序,可在任意兩種進制之間進行轉換。
?
?
這個程序比較簡單,定義了4個函數:
main()函數為主函數,接收輸入源數據、進制,以及需要轉換成的進制。 ??int_pow()函數為冪運算函數。在任意進制數按權展開時需要用到冪運算。 ??xtod()函數為將任意進制轉換為十進制的函數,通過按權展開的方式進行。 ?dtox()函數為將十進制數轉換為任意進制的函數,通過除模取余的方法進行。
編譯運行以上程序,輸入一個數據及其進制,然后輸入要轉換到的進制,即可得到結 果。如圖1-36所示,當輸入BC0D?,并輸入進制為16 ,轉換的進制為10 ,則可得到48141。
?
圖1-36
1.4.6????二進制與八進制、十六進制的轉換
除了按以上方法進行任意進制之間的轉換外,在程序中經常用到的是二進制與八進 制、二進制與十六進制之間的轉換。對于這些特殊進制間的轉換,可以用更簡單的方法。
二進制數轉換為八進制數,可概括為“3位并1位”的方法。具體轉換方法是:按從右向 左的方向,每3位二進制數為一組,最高位不足3位時,添0補足3位,然后將各組的3位二 進制數按22 、21 、20權展開后相加,得到一位八進制數。例如:
?
而將八進制數轉換為二進制數時,可采用相反的操作,即將每位八進制數拆為3位二 進制數,稱為“1位拆3位”。
類似地,由于1位十六進制數與4位二進制數對應,二進制數轉換為十六進制數時就可 按“4位并1位”的方法進行,而十六進制數轉換為二進制數則可按“1位拆4位”的方法進行。
?
第2章 ?神奇的素數
素數在自然數中占有非常重要的地位,素數是一類既簡單又神秘的數字。說其簡單, 是因為小學生也知道什么是素數;說其神秘,是因為從古至今,多少數學家都想弄明白素 數的規則,卻一直沒有找到其分布規律。
數學家都沒研究出來的規律,程序員當然也不可能會找到。但是,任何事物都有正反 兩面,正是由于素數的無規律特點,在密碼學中就可以大量采用。另外,在一些齒輪嚙合 設計中,也通常將齒輪的齒數設計成素數,以增加兩齒輪中兩個相同的齒相遇嚙合次數的 最小公倍數,這樣可增強齒輪的耐用度,減少故障。
?
總結
以上是生活随笔為你收集整理的程序员的数学思维修炼(趣味解读)还有哪些进制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决移动端上用overflow-y:sc
- 下一篇: python构建聊天机器人之录制声音保存