- 計算機系統平臺
- 王曉英 曹騰飛 孟永偉 黃建強
- 2334字
- 2019-10-18 19:26:02
2.1.2 進制轉換
對于任何一個數,我們可以用不同的進位制表示。比如:十進制數(57)10可以用二進制表示為(111001)2,也可以用八進制表示為(71)8,也可以用十六進制表示為(39)16,它們所代表的數值都是一樣的。
在進制中,各位數字所表示值的大小不僅與該數字本身的大小有關,還與該數字所在的位置有關,我們將每一固定位置對應的單位值稱為位權。例如十進制第1位的位權為100,第2位的位權為101;而二進制第1位的位權為20,第2位的位權為21,對于N進制數,整數部分第i位的位權為Ni-1,而小數部分第j位的位權為N-j。如十進制數時3721可以寫為每一位數字與其位權之積的和:
3721=3×103+7×102+2×101+1×100
其他進制數也可以這樣表示。
1.其他進制轉換為十進制
用按權展開法,把一個任意R進制數anan-1...a1a0.a-1a-2...a-m轉換成十進制數,其十進制數值為每一位數字與其位權之積的和。
an×Rn+an-1×Rn-1+…+a1×R1+a0×R0+a-1×R-1+a-2×R-2+…+a-m×R-m
(1)二進制轉換為十進制
二進制數的基數為2,第0位的權值是20,第1位的權值是21……。所以,設有一個二進制數:101100100,寫成按位權展開的形式,并計算結果:
1×28+0×27+1×26+1×25+0×24+0×23+1×22+0×21+0×20=356
0乘以任何值都是0,所以忽略值為0的位:
1×28+1×26+1×25+1×22=356
(2)八進制轉換為十進制
八進制就是逢八進一。八進制數采用0~7表達一個數。八進制數第0位的權值為80,第1位權值為81,第2位權值為82……。所以,設有一個八進制數:1507,轉換為十進制為:839,可以直接計算如下:
1×83+5×82+0×81+7×80=839
(3)十六進制轉換為十進制
十六進制就是逢十六進一,但只有0~9這10個數字,所以用A~F這6個字母來分別表示10~15。字母不區分大小寫。十六進制數的第0位的權值為160,第1位的權值為161,第2位的權值162……。所以,假設有一個十六進制數2AF5,直接計算就是:
2×163+A×162+F×161+5×160=10997
此處可以看出,所有進制均可換算成十進制,關鍵在于各自的權值不同。
2.十進制轉換為二進制
十進制數轉換為二進制數時,由于整數和小數的轉換方法不同,所以先將十進制數的整數部分和小數部分分別轉換后,再加以合并。
十進制整數轉換為二進制整數采用“除2取余,逆序排列”法。具體做法是:用2整除十進制整數,可以得到一個商和余數;再用2去除商,又會得到一個商和余數,如此進行,直到商為0,然后把先得到的余數作為二進制數的低位有效位,后得到的余數作為二進制數的高位有效位,依次排列。例如,將(46)10轉換為二進制(101110)2的過程如圖2-1所示。

圖2-1 十進制轉換為二進制過程示意圖
假設十進制整數A轉換后得二進制數為edcba,那么二進制數按權展開,得:
e×24+d×23+c×22+b×21+a×20=A(二進制數轉換為十進制數的過程)
假設該數未轉換為二進制數,除以基數2得:
A/2=e×24/2+d×23/2+c×22/2+b×21/2+a×20/2
注意:a的值為0或1,不能被2整除,因此余下;其他的各項均能被2整除,因為它們都包含因數2。除以2后得到的商為:
e×23+d×22+c×21+b×20
再除以基數2余下了b,依此類推。當這個數不能再被2除時,最先余的a在低位,而后來的余數依次在高位,所以要把所有的余數按照逆序排列,正好是edcba。
十進制小數轉換成二進制小數采用“乘2取整,順序排列”法。具體做法是:用2乘以十進制小數,可以得到積,將積的整數部分取出,再用2乘以余下的小數部分,又得到一個積,再將積的整數部分取出,如此進行,直到乘積中的小數部分為零,然后把取出的整數部分按順序排列,先取的整數作為二進制小數的高位有效位,后取的整數作為低位有效位。例如,將(0.625)10轉換為二進制得(0.101)2。
0.625×2=1.25--------------取出整數部分1(高位)
0.25×2=0.5---------------取出整數部分0
0.5×2=1----------------取出整數部分1(低位)
假設一個十進制小數B轉換為二進制小數0.ab的形式,同樣按權展開,得:
B=a×2-1+b×2-2
因為小數部分的位權是負次冪,所以只能乘2,得:
2×B=a+b×2-1
注意:a變成了整數部分,我們取整數正好是取到了a,剩下的小數部分依此類推。小數部分的按權展開的數位順序正好和整數部分相反,所以不必反向排列。
3.二進制數與十六進制數相互轉換
二進制和十六進制的互相轉換比較重要,因為在程序中經常把二進制數寫為十六進制的形式,從而容易閱讀。不過這二者的轉換卻不用計算,每位程序員都應當能將二進制數直接轉換為十六進制數,反之亦然。
十六進制有16個數,即0~15,用二進制表示15就是1111,從而可以推斷出,16個數用二進制可以表示成0000~1111,顧名思義,也就是每四個二進制位為一個十六進制數。
(0111101)2可以這樣分組:0011|1101(從右往左,每4位為一組,最高位不足4位可用0補齊),把每一組(4位)二進制數轉換為十進制數,然后再寫成對應十六進制數的形式。0111101就可以換算成十六進制的(3D)16。
如果是帶有小數的二進制數,則小數部分從左往右每4位為一組,不足4位低位用0補齊。然后每一組(4位)二進制數轉換為十進制數,然后再寫為十六進制數的形式,組成十六進制數的小數部分。
反之,如何迅速將十六進制數轉換為二進制數呢?把每1位十六進制數轉換為4位二進制數即可。例如十六進制數FD轉換為二進制數,先轉換F,它是十進制的15,然后15再轉換為二進制數。這里不使用“除2取余”的方法,直接使用四位二進制數各位的權值8421去湊。F=8+4+2+1,所以四位全為1,即二進制數為1111。接著轉換D,它的十進制數是13,13=8+4+1,沒有權值2,則二進制數的第二位為0,即二進制數為1101。所以,(FD)16轉換為二進制數為(11111101)2。
4.二進制數與八進制數相互轉換
二進制數轉換為八進制數的方法與二進制數轉換為十六進制數的方法相似。因為八進制數有0~7八個數字,可用二進制表示為000~111,也就是每三個二進制位為一個八進制位。則二進制數整數部分從右往左每三位為一組(不足三位高位用0補齊),轉換為十進制數,則得到轉換后的八進制數。二進制小數部分則按照從左到右的順序每三位分為一組(不足三位低位用0補齊),轉換為十進制數。例如(11001.101)2=(011001.101)2=(31.5)8
- pcDuino開發實戰
- Containerization with LXC
- 精通Linux內核開發
- Windows Phone 7.5 Data Cookbook
- Installing and Configuring Windows 10:70-698 Exam Guide
- Mobile First Design with HTML5 and CSS3
- 網絡操作系統教程:Windows Server 2016管理與配置
- Learning Magento 2 Administration
- 云原生落地:產品、架構與商業模式
- OpenSolaris設備驅動原理與開發
- 鴻蒙HarmonyOS手機應用開發實戰
- Ubuntu Linux操作系統實用教程
- 嵌入式微系統
- Linux操作系統案例教程(第2版)
- Hadoop Operations and Cluster Management Cookbook