一、 十進制與二進制之間的轉(zhuǎn)換
1.1 十進制轉(zhuǎn)換為二進制,分為整數(shù)部分和小數(shù)部分
【1】整數(shù)部分
方法:采用"除2取余,逆序排列"法
即每次將整數(shù)部分除以2,余數(shù)為該位權(quán)上的數(shù),而商繼續(xù)除以2,余數(shù)又為上一個位權(quán)上的數(shù),這個步驟一直持續(xù)下去,直到商為0為止,最后讀數(shù)時候,從最后一個余數(shù)讀起,一直到最前面的一個余數(shù)。
舉個栗子:將十進制數(shù)168轉(zhuǎn)換為二進制數(shù)
? ? ? ? ? ? ?除數(shù)? ? ? ?被除數(shù)? ? ? ? ? ?商? ? ? ? ? ?余數(shù)
第0位:168? ? ? /? ? ? ? 2??? ? ?=? ? ?84? ......0
第1位:84? ? ? ?/? ? ? ? ?2? ? ? ?=? ? ?42 ......0
第2位:42? ? ? ?/? ? ? ? ?2? ? ? ?=? ? ?21 ......0
第3位:21? ? ? ?/? ? ? ? ?2? ? ? ?=? ? ?10 ........1
第4位:10? ? ? ?/? ? ? ? ?2? ? ? ?=? ? ? 5 ........0
第5位:5? ? ? ? ?/? ? ? ? ?2? ? ? ?=? ? ? 2 ........?1
第6位:2? ? ? ? ?/? ? ? ? ?2? ? ? ?=? ? ? 1 ........0
第7位:1? ? ? ? ?/? ? ? ? ?2? ? ? ?=? ? ? 0 ........1
最后,讀數(shù)字從最后的余數(shù)向前讀,即10101000
(2)小數(shù)部分
方法:采用"乘2取整,順序排列"法
即將小數(shù)部分乘以2,然后取整數(shù)部分;剩下的小數(shù)部分繼續(xù)乘以2,然后取整數(shù)部分;剩下的小數(shù)部分又乘以2,一直取到小數(shù)部分為零為止。
如果永遠不能為零,就同十進制數(shù)的四舍五入一樣,按照要求保留多少位小數(shù)時,就根據(jù)后面一位是0還是1,取舍,如果是零,舍掉,如果是1,向入一位。
換句話說就是0舍1入。讀數(shù)要從前面的整數(shù)讀到后面的整數(shù)。
栗子1:將0.125換算為二進制
? ? ? ? ? ? ?乘數(shù)? ? ? ? ? ? 乘數(shù)? ? ? ? ? ?積? ? ? ? ? ?整數(shù)部分? ? ? 小數(shù)部分
第2位:0.125? ? ?*? ? ? 2? ? ? ?=? ? ?0.25? ? ......0......? ??0.25
第1位:0.25? ? ? ?*? ? ? 2? ? ? ?=? ? ?0.5? ? ? ......0......? ??0.5
第0位:0.5? ? ? ? ?*? ? ? 2? ? ? ?=? ? ?1.0? ? ? ......1......? ??0.0
最后讀數(shù),從整數(shù)部分自上而下排序,第一位讀起,讀到最后一位,即為0.001
栗子2:將0.45轉(zhuǎn)換為二進制(保留到小數(shù)點第四位)
? ? ? ? ? ? 乘數(shù)? ? ? ? ? ? 乘數(shù)? ? ? ? ? ?? ?積? ? ? ? ? ?整數(shù)部分? ? ?小數(shù)部分
第4位:0.45? ? ? *? ? ? 2? ? ? ? ?=? ? ?0.9? ? ......0......? ??0.9
第3位:0.9? ? ? ? *? ? ? 2? ? ? ? ?=? ? ?1.8? ? ......1......? ??0.8
第2位:0.8? ? ? ? *? ? ? 2? ? ? ? ?=? ? ?1.6? ? ......1......? ??0.6
第1位:0.6? ? ? ? *? ? ? 2? ? ? ? ?=? ? ?1.2? ? ......1......? ??0.2
第0位:0.2? ? ? ? *? ? ? 2? ? ? ? ?=? ? ?0.4? ? ......0......? ??0.4
從上面步驟可以看出,當?shù)?次做乘法時候,得到的積是0.4,那么小數(shù)部分繼續(xù)乘以2,得0.8;繼續(xù),0.8又乘以2的,得到1.6;然后一直乘下去,最后不可能得到小數(shù)部分為零。因此,這個時候只好學(xué)習(xí)十進制的方法進行四舍五入了,但是二進制只有0和1兩個,于是就出現(xiàn)0舍1入。這個也是計算機在轉(zhuǎn)換中會產(chǎn)生誤差,但是由于保留位數(shù)很多,精度很高,所以可以忽略不計。
最后度數(shù),從整數(shù)部分自上而下,可知將0.45轉(zhuǎn)換為二進制約等于0.0111
上面介紹的方法是十進制轉(zhuǎn)換為為二進制的方法,需要大家注意的是:
十進制轉(zhuǎn)換為二進制,需要分成整數(shù)和小數(shù)兩個部分分別轉(zhuǎn)換。
當轉(zhuǎn)換整數(shù)時,用的是除2取余法;
當轉(zhuǎn)換小數(shù)時,用的是乘2取整法。
注意轉(zhuǎn)換進制數(shù)的讀數(shù)方向。
因此,我們從上面的方法,我們可以得出十進制數(shù)168.125轉(zhuǎn)換為二進制為10101000.001,或者十進制數(shù)轉(zhuǎn)換為二進制數(shù)約等于10101000.0111。
1.2 二進制轉(zhuǎn)換為十進制
方法:按權(quán)相加法
以小數(shù)點(.)為分界點,整數(shù)部分二進制轉(zhuǎn)為十進制要從右到左用二進制的每個數(shù)去乘以2的相應(yīng)次方,而小數(shù)點后的則是從左往右。
即將二進制每位上的數(shù)乘以權(quán),然后相加之和即是十進制數(shù)。
舉個栗子:將二進制數(shù)101.101轉(zhuǎn)換為十進制數(shù)。
101.101 =1*2^2+0*2^1+1*2^0+1*2^(-1)+0*2^(-2)+1*2^(-3) = 4+0+1+1/2+0+1/8?= 5.625?
得出結(jié)果:(101.101)2=(5.625)10
大家在做二進制轉(zhuǎn)換成十進制需要注意的是:
要知道二進制每位的權(quán)值。
要能求出每位的值。
二、 二進制與八進制之間的轉(zhuǎn)換
首先,我們需要了解一個數(shù)學(xué)關(guān)系,即23=8,24=16,而八進制和十六進制是用這關(guān)系衍生而來的,即用三位二進制表示一位八進制,用四位二進制表示一位十六進制數(shù)。
接著,記住4個數(shù)字8、4、2、1(23=8、22=4、21=2、20=1)?,F(xiàn)在我們來練習(xí)二進制與八進制之間的轉(zhuǎn)換。
(1) 二進制轉(zhuǎn)換為八進制
方法:取三合一法
即從二進制的小數(shù)點為分界點,向左(向右)每三位取成一位,接著將這三位二進制按權(quán)相加,得到的數(shù)就是一位八位二進制數(shù),然后,按順序進行排列,小數(shù)點的位置不變,得到的數(shù)字就是我們所求的八進制數(shù)。如果向左(向右)取三位后,取到最高(最低)位時候,如果無法湊足三位,可以在小數(shù)點最左邊(最右邊),即整數(shù)的最高位(最低位)添0,湊足三位。
栗子1:將二進制數(shù)101110.101轉(zhuǎn)換為八進制
按照取三合一原則,將101110.101劃分為:101110?.101每三位對應(yīng)一位八進制數(shù),則
101----->1* 2^2 + 0* 2^1 + 1* 2^0?= 5
110----->1* 2^2 + 1* 2^1 + 0* 2^0?=6
.?
101----->1* 2^2 + 0* 2^1 + 1* 2^0?=5
最后得到結(jié)果:將二進制101110.101轉(zhuǎn)八進制數(shù)為56.5
栗子2:將二進制數(shù)1101.1轉(zhuǎn)換為八進制
按照取三合一原則,不夠三位的在高位補0,將1101.1劃分為:001101?.100每三位對應(yīng)一位八進制數(shù),則
001----->0* 2^2 + 0* 2^1 + 1* 2^0?=1?
101----->1* 2^2 + 0* 2^1 + 1* 2^0?=5?
.?
100----->1* 2^2 + 0* 2^1 + 0* 2^0?=54
得到結(jié)果:將十進制數(shù)1101.1轉(zhuǎn)八進制數(shù)為15.4
(2) 將八進制轉(zhuǎn)換為二進制
方法:取一分三法
即將一位八進制數(shù)分解成三位二進制數(shù),用三位二進制按權(quán)相加去湊這位八進制數(shù),小數(shù)點位置照舊。
舉個栗子:
1.將八進制數(shù)67.54轉(zhuǎn)換為二進制
因此,將八進制數(shù)67.54轉(zhuǎn)換為二進制數(shù)為110111.101100,即110111.1011
大家從上面這道題可以看出,計算八進制轉(zhuǎn)換為二進制
首先,將八進制按照從左到右,每位展開為三位,小數(shù)點位置不變
然后,按每位展開為22,21,20(即4、2、1)三位去做湊數(shù),即a×22+ b×21 +c×20=該位上的數(shù)(a=1或者a=0,b=1或者b=0,c=1或者c=0),將abc排列就是該位的二進制數(shù)
接著,將每位上轉(zhuǎn)換成二進制數(shù)按順序排列
最后,就得到了八進制轉(zhuǎn)換成二進制的數(shù)字。
以上的方法就是二進制與八進制的互換,大家在做題的時候需要注意的是:
他們之間的互換是以一位與三位轉(zhuǎn)換,這個有別于二進制與十進制轉(zhuǎn)換
大家在做添0和去0的時候要注意,是在小數(shù)點最左邊或者小數(shù)點的最右邊(即整數(shù)的最高位和小數(shù)的最低位)才能添0或者去0,否則將產(chǎn)生錯誤
三、 二進制與十六進制的轉(zhuǎn)換
方法:與二進制與八進制轉(zhuǎn)換相似,只不過是一位(十六)與四位(二進制)的轉(zhuǎn)換
(1) 二進制轉(zhuǎn)換為十六進制
方法:取四合一法
即從二進制的小數(shù)點為分界點,向左(向右)每四位取成一位,接著將這四位二進制按權(quán)相加,得到的數(shù)就是一位十六位二進制數(shù),然后,按順序進行排列,小數(shù)點的位置不變,得到的數(shù)字就是我們所求的十六進制數(shù)。如果向左(向右)取四位后,取到最高(最低)位時候,如果無法湊足四位,可以在小數(shù)點最左邊(最右邊),即整數(shù)的最高位(最低位)添0,湊足四位。
1.例:將二進制11101001.1011轉(zhuǎn)換為十六進制
按照取四合一原則,不夠四位的在高位補0,將11101001.1011劃分為:11101001?.1011每四位對應(yīng)一位八進制數(shù),則
1110----->1*2^3 + 1* 2^2 + 1* 2^1 + 0* 2^0?= 14=E?
1001----->1*2^3 + 0* 2^2?+ 0* 2^1 + 1* 2^0?=9?
.?
1011----->1*2^3 + 0* 2^2 + 1* 2^1 + 1* 2^0?= 11=B
得到結(jié)果:將二進制11101001.1011轉(zhuǎn)換為十六進制為E9.B
2.例:將101011.101轉(zhuǎn)換為十六進制
因此得到結(jié)果:將二進制101011.101轉(zhuǎn)換為十六進制為2B.A
(2)將十六進制轉(zhuǎn)換為二進制
方法:取一分四法
即將一位十六進制數(shù)分解成四位二進制數(shù),用四位二進制按權(quán)相加去湊這位十六進制數(shù),小數(shù)點位置照舊。
1.將十六進制6E.2轉(zhuǎn)換為二進制數(shù)
因此得到結(jié)果:將十六進制6E.2轉(zhuǎn)換為二進制為01101110.0010即110110.001
四、八進制與十六進制的轉(zhuǎn)換
方法:一般不能互相直接轉(zhuǎn)換,一般是將八進制(或十六進制)轉(zhuǎn)換為二進制,然后再將二進制轉(zhuǎn)換為十六進制(或八進制),小數(shù)點位置不變。那么相應(yīng)的轉(zhuǎn)換請參照上面二進制與八進制的轉(zhuǎn)換和二進制與十六進制的轉(zhuǎn)。
五、八進制與十進制的轉(zhuǎn)換
(1)八進制轉(zhuǎn)換為十進制
方法:按權(quán)相加法
即將八進制每位上的數(shù)乘以位權(quán),然后相加之和即是十進制數(shù)。
例:1.將八進制數(shù)67.35轉(zhuǎn)換為十進制
(2)十進制轉(zhuǎn)換為八進制
十進制轉(zhuǎn)換成八進制有兩種方法:
1)間接法:先將十進制轉(zhuǎn)換成二進制,然后將二進制又轉(zhuǎn)換成八進制
2)直接法:前面我們講過,八進制是由二進制衍生而來的,因此我們可以采用與十進制轉(zhuǎn)換為二進制相類似的方法,還是整數(shù)部分的轉(zhuǎn)換和小數(shù)部分的轉(zhuǎn)換,下面來具體講解一下:
1.整數(shù)部分
方法:除8取余法,即每次將整數(shù)部分除以8,余數(shù)為該位權(quán)上的數(shù),而商繼續(xù)除以8,余數(shù)又為上一個位權(quán)上的數(shù),這個步驟一直持續(xù)下去,直到商為0為止,最后讀數(shù)時候,從最后一個余數(shù)起,一直到最前面的一個余數(shù)。
2.小數(shù)部分
方法:乘8取整法,即將小數(shù)部分乘以8,然后取整數(shù)部分,剩下的小數(shù)部分繼續(xù)乘以8,然后取整數(shù)部分,剩下的小數(shù)部分又乘以8,一直取到小數(shù)部分為零為止。如果永遠不能為零,就同十進制數(shù)的四舍五入一樣,暫取個名字叫3舍4入。
例:將十進制數(shù)796.703125轉(zhuǎn)換為八進制數(shù)
解:先將這個數(shù)字分為整數(shù)部分796和小數(shù)部分0.703125
因此,得到結(jié)果十進制796.703125轉(zhuǎn)換八進制為1434.55
上面的方法大家可以驗證一下,你可以先將十進制轉(zhuǎn)換,然后在轉(zhuǎn)換為八進制,這樣看得到的結(jié)果是否一樣
六、十六進制與十進制的轉(zhuǎn)換
(1)十六進制轉(zhuǎn)換為十進制
方法:按權(quán)相加法
即將十六進制每位上的數(shù)乘以位權(quán),然后相加之和即是十進制數(shù)。
16進制就是逢16進1,但我們只有0~9這十個數(shù)字,所以我們用A,B,C,D,E,F(xiàn)這六個字母來分別表示10,11,12,13,14,15。字母不區(qū)分大小寫。
十六進制數(shù)的第0位的權(quán)值為16的0次方,第1位的權(quán)值為16的1次方,第2位的權(quán)值為16的2次方……
所以,在第N(N從0開始)位上,如果是是數(shù) X (X 大于等于0,并且X小于等于 15,即:F)表示的大小為 X * 16的N次方。
舉個栗子:將十六進數(shù) 0X5FA5轉(zhuǎn)為十進制數(shù)
第0位:5 *16^0 = 5
第1位:A*16^1 = 10*16^1 = 160
第2位:F*16^2?= 15*16^2 = 3840
第3位:5*16^3 = 20480
將十六進數(shù) 0X5FA5轉(zhuǎn)為十進制數(shù)即24485
可以看出,所有進制換算成10進制,關(guān)鍵在于各自的權(quán)值不同。
(2)十進制轉(zhuǎn)換為十六進制
十進制轉(zhuǎn)換成十六進制有兩種方法:
1)間接法:先將十進制轉(zhuǎn)換成二進制,然后將二進制又轉(zhuǎn)換成十六進制。
2)直接法:前面我們講過,十六進制是由二進制衍生而來的,因此我們可以采用與十進制轉(zhuǎn)換為二進制相類似的方法,還是整數(shù)部分的轉(zhuǎn)換和小數(shù)部分的轉(zhuǎn)換。
下面來具體講解一下直接法:
整數(shù)部分
方法:除16取余法
即每次將整數(shù)部分除以16,余數(shù)為該位權(quán)上的數(shù),而商繼續(xù)除以16,余數(shù)又為上一個位權(quán)上的數(shù),這個步驟一直持續(xù)下去,直到商為0為止。另外,所得到的商的最后一位余數(shù)是所求二進制數(shù)的最高位。最后讀數(shù)時,從最后一個余數(shù)起,一直到最前面的一個余數(shù)。
小數(shù)部分
方法:乘16取整法
即將小數(shù)部分乘以16,然后取整數(shù)部分,剩下的小數(shù)部分繼續(xù)乘以16,然后取整數(shù)部分,剩下的小數(shù)部分又乘以16,一直取到小數(shù)部分為0為止。如果永遠不能為零,就同十進制數(shù)的四舍五入一樣,暫取個名字叫3舍4入。故該法稱“乘基取整法”
例:將十進制數(shù)120.12轉(zhuǎn)換為十六進制數(shù)
解:先將這個數(shù)字分為整數(shù)部分120和小數(shù)部分0.12
因此,得到結(jié)果十進制120.12轉(zhuǎn)換十六進制為0x78.1eb851eb852
七、Java代碼測試十進制分別轉(zhuǎn)換為十六進制,二進制,八進制
核心思想:余數(shù)定理
測試類:
/**
* 測試:十進制數(shù)分別轉(zhuǎn)換為十六進制,二進制,八進制數(shù)
* 核心思想:余數(shù)定理
*/publicclassDataConvertDemo{publicstaticvoidmain(String[] args){inta =27, b =37, c =47;System.out.print("十進制數(shù)"+ a +"=>十六進制輸出:");cha_16(a);System.out.println();System.out.print("十進制數(shù)"+ b +"=>二進制輸出:");cha_2(b);System.out.println();System.out.print("十進制數(shù)"+ c +"=>八進制輸出:");cha_8(c);}/**
*
* 轉(zhuǎn)為16進制
*/staticvoidcha_16(intn){if(n >=16) {cha_16(n /16);}if(n %16<10) {System.out.print(n %16);}else{System.out.print((char) (n %16+55));}}/**
* 轉(zhuǎn)為2進制
*/staticvoidcha_2(intn){if(n >=2){cha_2(n /2);}System.out.print(n %2);}/**
* 轉(zhuǎn)為8進制
*/staticvoidcha_8(intn){if(n >=8) {cha_8(n /8);System.out.print(n %8);}else{System.out.print(n);}}}
測試結(jié)果:
十進制數(shù)27=>十六進制輸出:1B
十進制數(shù)37=>二進制輸出:100101
十進制數(shù)47=>八進制輸出:57