- 教孩子學編程(信息學奧賽C語言版)
- 黨松年 方澤波
- 2278字
- 2020-05-22 15:22:47
1.7 數制轉換
我們在小學算術中學過,十進制數的個位(從右向左第1位)上的1表示數值1,十位(從右向左第2位)上的1表示數值10,百位(從右向左第3位)上的1表示數值100,千位(從右向左第4位)上的1表示數值1000,依此類推,從右向左第n位上的1表示的數值是10n-1。我們把一個數從右向左第n位上的1所表示的數值大小稱為該數位上的位權。表1.5列出了十進制數、二進制數、八進制數和十六進制數各個數位上的位權大小。
表1.5 各個數位上的位權
一個十進制數所表示的數值大小就等于各個數位上的位權乘以該數位上的值(0~9)再相加得到的總和。例如:
9504=1000×9+100×5+10×0+1×4
二進制數也是同樣的原理。二進制數從右向左第1位上的1表示數值1(20),第2位上的1表示數值2(21),第3位上的1表示數值4(22),第4位上的1表示數值8(23),依此類推,從右向左第n位上的1表示的數值是2n-1。
二進制數各位的位權與各位上的值(0或1)的乘積的總和就是這個二進制數所對應的十進制數(見圖1.10)。例如把二進制數101011轉換為十進制數就是:
25×1+24×0+23×1+22×0+21×1+20×1=32+0+8+0+2+1=43
同理,八進制數各位的位權(8n-1)與各位上的值(0~7)的乘積的總和就是這個八進制數所對應的十進制數(見圖1.11)。例如把八進制數1753轉換為十進制數就是:
83×1+82×7+81×5+80×3=512+448+40+3=1003
圖1.10 二進制數轉換為十進制數(位權2n-1的利用)
圖1.11 八進制數轉換為十進制數(位權8n-1的利用)
十六進制數各位的位權(16n-1)與各位上的值(0~F)的乘積的總和就是這個十六進制數所對應的十進制數(見圖1.12)。例如把十六進制數27DB轉換為十進制數就是:
163×2+162×7+161×13+160×11=8192+1792+208+11=10203
圖1.12 十六進制數轉換為十進制數(位權16n-1的利用)
利用二進制數各位的位權,可以把一個二進制數轉換為十進制數,那么如果要知道十進制數所對應的二進制數是多少,該怎么辦呢?
我們通常使用輾轉相除求余法來得到一個十進制數所對應的二進制數,具體的操作步驟如下:用2去除十進制數,得到商和余數,這個余數就是對應的二進制數從右向左第1位的值;然后把商作為被除數繼續用2去除,又得到一個商和余數,此時的余數就是對應的二進制數從右向左第2位的值;再次把得到的第二個商作為被除數繼續用2除,得到第三個商和余數,這時的余數就是對應的二進制數從右向左第3位的值;像這樣把每次得到的商作為被除數用2除,獲取余數,直到商為0。最后把得到的所有余數從右向左依次排列就是這個十進制數對應的二進制數(見圖1.13)。
知識點總結
在二進制數中,從右向左第n位擁有2n-1(2的n-1次方)的“位權”。
在八進制數中,從右向左第n位擁有8n-1(8的n-1次方)的“位權”。
在十六進制數中,從右向左第n位擁有16n-1(16的n-1次方)的“位權”。
各位的位權與各位上的值的乘積的總和就是這個數所對應的十進制數。
圖1.13 把十進制數轉換為二進制數的步驟
同樣的原理,用8作為除數對一個十進制數進行輾轉相除,把得到的所有余數從右向左依次排列,可以得到這個十進制數對應的八進制數(見圖1.14)。
圖1.14 把十進制數轉換為八進制數的步驟
用16作為除數對一個十進制數進行輾轉相除,把得到的所有余數從右向左依次排列,可以得到這個十進制數對應的十六進制數(見圖1.15)。
圖1.15 把十進制數轉換為十六進制數的步驟
當把二進制數轉換為八進制數或十六進制數時,可以先把二進制數轉換為十進制數,然后再把這個十進制數轉換為八進制數或十六進制數;反過來,八進制數或十六進制數轉換為二進制數時,則先把它轉化為十進制數,再把這個十進制數轉換為二進制數;八進制數與十六進制數之間的相互轉換也是如此。除此之外,我們也可以利用前面講過的各個數位上的位權,把二進制數直接轉換為八進制數或十六進制數。要進行這種直接轉換需要了解二進制數與八進制數、十六進制數之間的特殊關系。
知識點總結
用2除十進制數時得到的余數就是十進制數所對應的二進制數各位的值。
用8除十進制數時得到的余數就是十進制數所對應的八進制數各位的值。
用16除十進制數時得到的余數就是十進制數所對應的十六進制數各位的值。
八進制數的各位可以取0~7這幾個值,這正好是用3位二進制數(000~111)能表示的值(見表1.6);十六進制數的各位可以取0~F這幾個值,這正好是用4位二進制數(0000~1111)能表示的值(見表1.7)。因此我們可以總結出下面的特殊關系:
·二進制數的3位相當于八進制數的1位;
·二進制數的4位相當于十六進制數的1位。
表1.6 二進制數與八進制數對應表
表1.7 二進制數與十六進制數對應表
所以當把二進制數轉換為八進制數時,可以從低位起(從右向左)把二進制數劃分為每3位一個區間,再把每個區間內的3位二進制數轉換為對應的十進制數,這樣最終得到的數就是這個二進制數對應的八進制數。當把二進制數轉換為十六進制數時,可以從低位起(從右向左)把二進制數劃分為每4位一個區間,再把每個區間內的4位二進制數轉換為對應的十進制數(10~15用A~F表示),這樣最終得到的數就是這個二進制數對應的十六進制數(見圖1.16)。
反過來,把八進制數轉換為二進制數時,將八進制數的各位變換為3位二進制數,就得到了這個八進制數對應的二進制數;把十六進制數轉換為二進制數時,將十六進制數的各位變換為4位二進制數,就得到了這個十六進制數對應的二進制數(見圖1.17)。
知識點總結
3位二進制數的值正好能用1位八進制數來表示。
4位二進制數的值正好能用1位十六進制數來表示。
在C語言中如果一個數以0x開頭,表示這是一個十六進制數。比如0x45表示45是一個十六進制數。
在C語言中如果一個數以0開頭,表示這是一個八進制數。比如025表示25是一個八進制數。
圖1.16 把二進制數轉換為八進制數、十六進制數的步驟
圖1.17 把八進制數、十六進制數轉換為二進制數的步驟
- 大學計算機基礎(第三版)
- 精通JavaScript+jQuery:100%動態網頁設計密碼
- 移動UI設計(微課版)
- 控糖控脂健康餐
- Flink SQL與DataStream入門、進階與實戰
- 從學徒到高手:汽車電路識圖、故障檢測與維修技能全圖解
- Getting Started with Python Data Analysis
- R Data Analysis Cookbook(Second Edition)
- C語言程序設計
- 區塊鏈技術進階與實戰(第2版)
- 零基礎學C語言第2版
- Mastering Elasticsearch(Second Edition)
- Node.js區塊鏈開發
- Mastering Embedded Linux Programming
- 高性能MVVM框架的設計與實現:San