正如我們在第 0 講學過的,指定一個底數 K (K 是大於一的整數), 任何正整數在以 K 為底的對位記數法之下,有唯一的一種表達方式。 通常我們以十為底,計算機的內部以二為底,為了表達和紀錄的方便, 我們經常將電腦內的資料以八或十六為底來呈現。
Matlab 提供一套函式幫助我們做無號整數的進制轉換。 其實,嚴格說來,應該是做 0 到 253 的整數進制轉換。 為什麼會是 253 這個奇怪的數?以後再跟您說明。
先看十進制轉換到十六進制的例子。 用指令
dec2hex(3)將十進制的 3 轉換成十六進制,答案還是 3。試試看
dec2hex(10)得到答案 A,這就有趣了。而
dec2hex(108)轉換成 6C。試試看更大的整數,譬如
T = 2^52 + 16 + 8 + 4;轉換成 1000000000001C,這是一個十六進制的 14 位數, 其中最後一位 C 就代表了 8+4 的部份,而倒數第二位 1 代表了 16。
dec2hex(T)
Matlab 能夠正確處理的最大整數是 253,再大就不行了。 試試看
dec2hex(2^53 - 1)分別得到答案
dec2hex(2^53)
dec2hex(2^53 + 1)
1FFFFFFFFFFFFF很明顯地,253-1 和 253 之十六進制數字都是正確的, 但 253+1 並不正確。
20000000000000
20000000000000
十進制數字轉換成二進制,可以直接利用 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);得到答案 1,也就是說 s 是一個由 '6' 和 'C' 兩個字元組成的字串,所以
ischar(s)
double(s)就得到那兩個字元的 ASCII 碼,也就是 54, 67。
dec2hex(), dec2bin() 和 dec2base() 分別有對應的反函式:hex2dec(), bin2dec() 和 base2dec()。但是要注意,這三個函式的輸入參數必須是字串,而非數值; 它們的答案卻是整數數值,而非字串。例如
bin2dec('1101')得到答案 13,
hex2dec('6C')得到答案 108,
base2dec('154', 8)也得到答案 108。
習題