Matlab 教材:無號整數的進制轉換

正如我們在第 0 講學過的,指定一個底數 K (K 是大於一的整數), 任何正整數在以 K 為底的對位記數法之下,有唯一的一種表達方式。 通常我們以十為底,計算機的內部以二為底,為了表達和紀錄的方便, 我們經常將電腦內的資料以八或十六為底來呈現。

Matlab 提供一套函式幫助我們做無號整數的進制轉換。 其實,嚴格說來,應該是做 0 到 253 的整數進制轉換。 為什麼會是 253 這個奇怪的數?以後再跟您說明。

先看十進制轉換到十六進制的例子。 用指令

dec2hex(3)
將十進制的 3 轉換成十六進制,答案還是 3。試試看
dec2hex(10)
得到答案 A,這就有趣了。而
dec2hex(108)
轉換成 6C。試試看更大的整數,譬如
T = 2^52 + 16 + 8 + 4;
dec2hex(T)
轉換成 1000000000001C,這是一個十六進制的 14 位數, 其中最後一位 C 就代表了 8+4 的部份,而倒數第二位 1 代表了 16。

Matlab 能夠正確處理的最大整數是 253,再大就不行了。 試試看

dec2hex(2^53 - 1)
dec2hex(2^53)
dec2hex(2^53 + 1)
分別得到答案
1FFFFFFFFFFFFF
20000000000000
20000000000000
很明顯地,253-1 和 253 之十六進制數字都是正確的, 但 253+1 並不正確。

十進制數字轉換成二進制,可以直接利用 Matlab 函式 dec2bin, 例如

dec2bin(3)
dec2bin(10)
dec2bin(108)
分別得到
11
1010
1101100
如果想要看到一定位數的二進制數字,譬如說八位數 (一個字元),可以說
dec2bin(10, 8)
得到 00001010。再試試剛才的大數
dec2bin(T)
得到
10000000000000000000000000000000000000000000000011100

但是十進制數字轉換八進制、或者要轉換成不是二也不是十六的其他進位制度, 就沒有專屬的函式可用。Matlab 提供了一般性的 dec2base() 函式。 使用方法是

dec2base(x, b, n)
其中 x 是一個不大於 253 的正整數, b 是作為基底的數,必須是從 2 到 36 之間的整數, 如果 b 超過 10,則依序採用大寫英文字母 A,B,C,... 當作數目字。 n 可以不寫,如果寫了,代表固定用 b 進制的 n 位數來輸出答案。

利用 dec2base() 可以做十進制到八進制數字的轉換。例如

dec2base(10, 8, 3)
得到 012,而
dec2base(108, 8, 3)
得到 154。

最後要提醒您注意,dec2hex(), dec2bin()dec2base() 這些函式的答案,都是「字串」而非數值。例如

s = dec2hex(108);
ischar(s)
得到答案 1,也就是說 s 是一個由 '6''C' 兩個字元組成的字串,所以
double(s)
就得到那兩個字元的 ASCII 碼,也就是 54, 67。

dec2hex(), dec2bin()dec2base() 分別有對應的反函式:hex2dec(), bin2dec()base2dec()。但是要注意,這三個函式的輸入參數必須是字串,而非數值; 它們的答案卻是整數數值,而非字串。例如

bin2dec('1101')
得到答案 13,
hex2dec('6C')
得到答案 108,
base2dec('154', 8)
也得到答案 108。

習題

  1. 請問,如果您要改寫 dec2base() 使得參數 b 可以超過 36, 容許 b 最大可以是 62。 您會遇到什麼困難?說說看,您可以如何克服這個困難。
  2. 請問,如果您要改寫 dec2base() 使得參數 b 可以超過 36, 容許 b 最大可以是 100。 您會遇到什麼困難?說說看,您可以如何克服這個困難。
  3. 請將十六進制數字 6C0A9B74FC 轉換成二進制數字。 您可以用紙筆計算,但是最好叫 Matlab 來幫忙。
  4. 請將十六進制數字 6C0A9B74FC 轉換成八進制數字。 您可以用紙筆計算,但是最好叫 Matlab 來幫忙。
  5. 請將二進制數字 10010011100110101111000110101110100 轉換成八進制數字。 您可以用紙筆計算,但是最好叫 Matlab 來幫忙。
  6. 請將二進制數字 10010011100110101111000110101110100 轉換成十六進制數字。 您可以用紙筆計算,但是最好叫 Matlab 來幫忙。
單維彰 (2004/01/08) --- 04/05/12 (單) [Prev] [Next] [Up]