標籤:

隨著計算機發展,有2進位、8進位、16進位,為什麼沒32進位、64進位?


簡單地說

1. 計算機內部工作用的是且僅是2進位。所有其他進位都只是給人們看的表達

2. 並不是沒有32進位,64進位。理論上任何進位都是可以有的,只是人們不需要或者說不用。

詳細地說

比如說十進位的195,在計算機內部工作時候是二進位的11000011,但要寫給人們看的時候,總不能寫那麼多0和1,多麻煩。而且你一眼也看不出來是多少,他可以寫成我們最熟悉的十進位的195。可惜十進位數位數並不對應確定的2進位數位數,比如8的二進位是1000,11的二進位是1011,二進位都是4位,但十進位一個是1位,一個兩位,這樣處女座程序員就會很不開心。所以人們就用16進位來表達195成C3,之所以是16進位,是因為他是2的次冪。所以每4位二進位就可以用1位16進位來表示。

那麼為什麼不用32進位呢?

首先,當然可以有32進位,這樣每5位二進位就可以用一位32進位的數來表示。(注意這裡只比16進位多表達了1位二進位)。那麼既然是一個數,我們總要用一個符號來寫出來吧,可惜人們只發明了0-9這10個數字,所以對於16進位,10=A,11=B,12=C,13=D,14=E,15=F。也就是借用了6個英文字母。也就是說在和人們最熟悉的十進位轉換中,人們需要記住這6個數字和字母的對應,人類還勉強應付的過來。那麼對於32進位呢,我們當然也可以用同樣的方法,讓16=G, 17=H, ... 31= V. 所以你會看到一個數字寫成BMW,或者FUCK,然後你會在心中罵,這tm是幾。然後那些cs學生做考卷的時候就會心裡暗自詛咒那個說要使用32進位的人。因為你現在要記憶22個字母和數字的對應去換成你最熟悉的10進位,大大增加了複雜度。卻並沒有讓你對二進位的表達變簡單多少。(前面說了只多表達了1位)所以本著no zuo no die的精神不要給自己,也不要給他人找麻煩。

從更深層次的角度說。現在計算機是64位(或32位)的,就是一次可以處理64位的二進位數,所以人們很關心如何表達64位二進位數。注意64是4的倍數,所以64位二進位數正好可以寫成16個16進位數。但是64不是5的倍數,用32進位不能很好表達64位二進位。比4大的下一個能被64整除的數是8,如果要一次表達8位二進位數,這就是256進位。可憐我們的字母也只有26個。所以一個256進位數都找不到很好的符號系統來表達他。你當然說我們可以創造一套符號,但是again,不要沒事找事,特別是沒有給人類帶來多方便的時候。

所以比較下來,16進位即可以縮減二進位的位數,又可以方便轉換到我們熟悉的十進位數,也可以方便的用幾個數字和字母寫出來。所以成為了計算機學科中常使用的數的表達方式。

這個問題其實很像我們有1元,2元,5元,但為什麼沒有3元,7元的鈔票一樣。對於這些完全可以人為決定的事,原則就是與人方便。


原因 floatingH2O 說得挺明白了。

不過想說一點,其實有種挺常用的 64進制 數表示法,叫做 base64 ,常見於各種需要把二進制數據編碼進可列印 ASCII 字元的地方。當然人們更多用它表示二進制串而不是數,不過你可以理解一長串二進制就是一個非常大的數嘛,於是 base64 就是挺常用的 64進制「數」。

同理 uuencode 和 BinHex 也是64進制「數」,也挺常用的,就是和 base64 用不同的對應關係表而已。以及還有 base32 是32進制「數」,雖然不那麼常用…… 還有更大的 base85 是 85 進制,常見於 PDF/PostScript 裏。

https://zh.wikipedia.org/wiki/Base64

==============

評論裏似乎有人沒看懂 base64 和 64進制數 有什麼關係。我舉個例子說明一下。

比如十進制數 4210752 ,它其實是 4*10^6+2*10^5+1*10^4+7*10^2+5*10^1+2*10^0 。

用 8 進制表示就是 0o20040100 = 2*8^7+4*8^4+1*8^2 (前面那個0o是8進制前綴)

用 16 進制表示就是 0x404040 = 4*16^5 + 4*16^3+4*16^1

用 64 進制就應該是形如 16*64^3+4*64^2+1*64 = {16}{4}{1}{0} 的4位64進制數,這裡用 {} 裡面的十進制數表示一位64進制。

然後爲了「正常」地「用一個字元表示一位」的方式表達 64進制數,我們需要一個對應字元表,把每一個64進制的位用一個字元表示。16進制的時候一般約定俗成用 0~9 加上 A~F ,64進制的時候顯然這麼表示就不夠了。此時 base64 就是一種常見的映射表,其中 0 到 25 是用 A~Z 表示的,於是 4210752 用 base64 表示就是 QEBA 。

爲什麼拿 4210752 舉例子呢,因爲它的 16進制 0x404040 很規整,而 0x40 正好是 ASCII 的字元 "@" 。於是我們可以知道字元串 "@@@" 表示成 16進制 就是 0x404040 ,然後把它表示成 base64 我們可以用命令:

$ echo -n "@@@" | base64
QEBA

可驗證這個數的 base64 表示就是 QEBA 。


32進位的話,你知道10+26=36,所以你需要使用0-9a-v來表示32進位數,也就是幾乎所有26個字母……

所以快速告訴我32進位p對應16進位多少?

至於64進位,你知道的10+26=36……

當然你可以用[01][0-9a-fA-F]來表示一位32進位,或者[0-3][0-9a-fA-F]表示一位64進位數,然而這樣的話用[0-9a-fA-F]{2}表示的256進位更自然一些。

嗯,從這個意義上講,2進位不僅僅是2進位,而是2,4,8,16,32,64……進位。


手指頭不夠多


首先,什麼是進位?


數制是數制,計算機是計算機,只要你樂意,512 進位都可以有


沒看明白。。。

現在PC運算單元64位的早就是主流了。。。。

如果是數學上。。。你不覺得32進位以上的你需要找很多很多的符號才夠用么。。。。

而且2^{n} 制之間轉換非常容易。。。。。。


推薦閱讀:

教育技術專業美國大學的排名?
在現在 有那麼多免費的好工具情況下,為什麼很多大學還在用1997年的VC6,甚至是1989年的Turbo C教學生C語言編程?課程老師也是極力推薦學生使用VC6,而不是微軟的Express版或GCC等軟體?
大學不教C(新生群上如是說),但是已經自學了一點點,學校以後只教C++,應該繼續學C嗎?
為什麼1/3無法用10進位完整描述,但是確可以用3進位,完全描述?
為什麼 C++ 不定死 bool 的大小?char 為何有三種?double 類型字面量如何書寫?標識符命名規則有哪些?

TAG:計算機科學 |