数位进制转换详解
文章目錄
- 進制
- 進制轉換
- 二進制和十進制互相轉換
- 十進制 → 二進制
- 十進制正整數 → 二進制
- 十進制負整數 → 二進制
- 十進制負小數 → 二進制
- 十進制小數 → 二進制
- 二進制 → 十進制
- 二進制負整數 → 十進制
- 二進制的正整數 → 十進制
- 二進制小數 → 十進制
- 二進制的負小數 → 十進制
- 八進制和十進制的轉換
- 十進制 → 八進制
- 十進制正整數 → 八進制
- 十進制負整數 → 八進制
- 十進制小數 → 八進制
- 十進制的負小數 → 八進制
- 八進制 → 十進制
- 八進制的正整數 → 十進制
- 八進制的小數 → 十進制數
- 八進制的負整數 → 十進制
- 八進制的負小數 → 十進制
- 十六進制和十進制的轉換
- 十六進制 → 十進制
- 十六進制正整數 → 十進制
- 十六進制小數 → 十進制
- 十六進制負整數 → 十進制
- 十六進制負小數 → 十進制
- 十進制 → 十六進制
- 十進制正整數 → 十六進制
- 十進制小數 → 十六進制
- 十進制負小數 → 十六進制
- 十進制負整數 → 十六進制
- 二進制和八進制的轉換
- 八進制 → 二進制
- 八進制正整數 → 二進制
- 八進制小數 → 二進制
- 八進制負整數 → 二進制
- 八進制的負小數 → 二進制
- 二進制 → 八進制
- 二進制的正整數 → 八進制
- 二進制小數 → 八進制
- 二進制負整數 → 八進制
- 二進制的負小數 → 八進制
- 二進制和十六進制的轉換
- 二進制 → 十六進制
- 二進制正整數 → 十六進制
- 二進制負整數 → 十六進制
- 二進制小數 → 十六進制
- 二進制負小數 → 十六進制
- 十六進制 → 二進制
- 十六進制的正整數 → 二進制
- 十六進制的負整數 → 二進制
- 十六進制的小數 → 二進制
- 十六進制的負小數 → 二進制
- 八進制和十六進制的轉換
- 十六進制 → 八進制
- 十六進制正整數 → 八進制
- 十六進制小數 → 八進制
- 十六進制負整數 → 八進制
- 十六進制負小數 → 八進制
- 八進制 → 十六進制
- 八進制的正整數 → 十六進制
- 八進制的正小數 → 十六進制
- 八進制的負整數 → 十六進制
- 八進制的負小數 → 十六進制
進制
23678(10進制) = 2*10000+3*1000+6*100+7*10+8*1= 2*10^4 + 3*10^3 + 6*10^2 + 7*10^1 + 8*10^0= 23678如上例所示,10 稱做"基數",10^n(10 的 n 次冪,n從0開始)被稱作"權",10000 1000 100 10 1
2進制的基數為2,權為2^n(2的n次方),128 64 32 16 8 4 2 1
16進制的基數為16,權為 16^n(16的 n 次方),4096 256 16 1
P.S 16進制的前綴是0X,數字零和英文字母X;
8進制的基數為8,權為 8^n(8的 n 次方),512 64 8 1
P.S 8進制的前綴通常是數字0。
注意:10進制與其它進制的轉換不能直接通過對照表的對應關系做簡單的替換,沒有這樣的替換關系
進制轉換
二進制和十進制互相轉換
十進制 → 二進制
十進制正整數 → 二進制
方法一(輾轉減權法)
十進制數:3765,如何轉換成二進制數?
第一步,寫出二進制的權數如下:
| 2048 | 1024 | 512 | 256 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
注意:權數是以十進制數來表示的,相鄰數是兩倍的關系,最大的權數必須最接近被轉換的十進制數(3765)
第二步,計算下3765含有多少個二進制的權數
3765 - 2048 = 1717,表示含有1個2048;
1717 - 1024 = 693, 表示含有1個1024;
693 - 512 = 181, 表示含有1個512;
181 - 128 = 53, 表示含有1個128;
53 - 32 = 21, 表示含有1個32;
21 - 16 = 5, 表示含有1個16;
5 - 4 = 1, 表示含有1個4;
1 - 1 = 0, 表示含有1個1。
那么我們按二進制的權數位置來標數,如下:
| 權數 | 2048 | 1024 | 512 | 256 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
| 二進制數 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 |
結果:十進制數3765轉換成二進制數是:1110101110101,計算機默認按int類型保存,所以實際應該是32位的二進制數:
00000000 00000000 00001110 10110101
方法二(輾轉整除法/除2取余法)
叫「輾轉整除法」,十進制數轉換成二進制數,那么就除以2,必須整除,得到“商數”繼續除以2,直到“商數”為0,最后得到的余數逆序排列就是對應的二進制數了。也叫「除2取余,逆序排列法」。
十進制數:12,如何轉成二進制數?
說明:12 ? 2 = 6,余數0;6 ? 2 = 3,余數0;3 ? 2 = 1,余數1;1? 2 = 0,余數1
十進制負整數 → 二進制
-33轉成二進制
思路:先得到33的二進制數,然后取反+1得到-33的二進制數
如果轉成8位的二進制補碼,計算過程如下:
最后得到-33的8位二進制碼:1101 1111
十進制負小數 → 二進制
-0.98如何轉換成二進制
思路:
先得到0.98的二進制數,然后取反+1得到-0.98的二進制數
0.98通過乘2取整法,得到二進制數。
十進制小數 → 二進制
十進制小數轉換成二進制小數采用"乘2取整,順序排列"法。具體做法是:用2乘十進制小數,可以得到積,將積的整數部分取出,再用2乘余下的小數部分,又得到一個積,再將積的整數部分取出,如此進行,直到積中的小數部分為零,或者達到所要求的精度為止。
然后把取出的整數部分按順序排列起來,先取的整數作為二進制小數的高位有效位,后取的整數作為低位有效位。
例如:0.96875如何轉換成二進制
二進制 → 十進制
二進制負整數 → 十進制
二進制數:11011111,如何轉成十進制數呢?
前提是要確認11011111是不是八位的二進制數(即byte類型),如果是byte類型,那么11011111肯定是負數,第一位表示符號,第一位為1表示負數,所以不能直接轉換成十進制數,需要先得到正數的補碼,再轉換成十進制的正數,最后得到對應的負數。
第一步,先得到正數的補碼(即負數對應的正數的二進制數):
取反+1
11011111
| 負數 | 11011111 |
| 取反 | 00100000 |
| +1得到補碼 | 00100001 |
最后得到11011111對應的正數的補碼:00100001
第二步,正數補碼轉換成十進制數
就是二進制數和對應的位置的權數相乘,最后求和,就可以得到十進制數。這個叫「按權相加法」。
換個表述,正的二進制整數,第n位置的數乘以2^(n-1),最后求和,就可以得到十進制數。n由右到左,從1開始。
| 權數 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
| 二進制數 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 |
十進制數:0 * 128 + 0 * 64 + 1 * 32 + 0 * 16 +0 * 8 + 0 * 4 + 0 * 2 + 1 * 1 = 33
第三步,既然11011111對應的十進制正數是33,那么11011111對應的十進制負數就是-33
說明:
二進制的正整數 → 十進制
二進制數:11011111,如何轉成十進制數呢?
前提是要確認這個二進制數的類型,如果是byte類型按上述流程來進行轉換,如果是short(16位),int(32位),long(64位)等類型的,那么說明前面都是0,給省略了,說明是正數,可以直接轉換成十進制數,也就是才有「按權相加法」得到十進制數。
| 權數(位權) | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
| 二進制數 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 |
十進制數:1 * 128 + 1* 64 + 0 * 32 + 1 * 16 +1 * 8 + 1 * 4 + 1 * 2 + 1 * 1 = 223
二進制小數 → 十進制
二進制的小數位則從左向右開始算,依次列為第1、2、3………n,然后將第n位的數乘以2的-n次方,然后相加即可得到小數位的十進制數(按權相加法)。
111.01如何轉換成十進制數?
將二進制數據111.01寫成加權系數的形式:
1 * 22+ 1 * 21+1 * 20 + 0 * 2-1 + 1 * 2-2 = 7.25
答:二進制111.01 轉換成十進制7.25
0.11111,如何轉換成十進制數呢?
1 * 2-1 + 1 * 2-2 + 1 * 2-3 + 1 * 2-4 + 1 * 2-5 = 0.96875
答:二進制0.11111轉換成十進制0.96875
二進制的負小數 → 十進制
思路:
通過二進制的負小數取反+1得到對應的二進制的正小數,然后計算出正小數的十進制數,最后看得到對應的十進制負數,這個負數就是二進制負小數轉換十進制的結果值。
八進制和十進制的轉換
Octal,縮寫OCT或O,一種以8為基數的計數法,采用0,1,2,3,4,5,6,7八個數字,逢八進1。一些編程語言中常常以數字0開始表明該數字是八進制。八進制的數和二進制數可以按位對應(八進制一位對應二進制三位),因此常應用在計算機語言中。
十進制 → 八進制
十進制正整數 → 八進制
方法一:叫「輾轉整除法」,也叫「除8取余法」
十進制數轉換成八進制數,就是拿十進制數除以8,必須整除,得到的“商數”繼續除以8,直到“商數”為0,最后得到的余數逆排序就是對應的8進制數了。
將十進制數115轉化為八進制數
結果:(115)10 = (163)8
方法2:先將十進制數轉換成二進制數,再將二進制數化為八進制數
十進制數115轉換成八進制數是多少呢?
(115)10 = (1110011)2 = (001 110 011)(163)8
十進制數-2轉換成八進制是多少呢?
先得到2的二進制數:00000000000000000000000000000010
取反+1得到-2的二進制數:11111111111111111111111111111110
轉換為8進制 :37777777776
十進制負整數 → 八進制
思路:
十進制負數 → 二進制數 → 八進制
-2 的二進制數:11111111 11111111 11111111 1111110
轉成八進制:37777777776
十進制小數 → 八進制
將十進制數(0.3125)10轉換成八進制數。
「乘8取整法」
十進制小數轉換成八進制小數采用"乘8取整,順序排列"法。具體做法是:用8乘十進制小數,可以得到積,將積的整數部分取出,再用8乘余下的小數部分,又得到一個積,再將積的整數部分取出,如此進行,直到積中的小數部分為零,或者達到所要求的精度為止。
然后把取出的整數部分按順序排列起來,先取的整數作為八進制小數的高位,后取的整數作為低位,這樣由各整數部分組成的數字就是轉化后八進制小數的值。
0.3125x8 = 2 .5 2
0.5x8 = 4 .0 4
結果:(0.3125)10=(0.24)8
十進制的負小數 → 八進制
思路:
先得到對應的十進制正小數,十進制的正小數轉成二進制的正小數,再取反+1得到二進制的負小數,這個就是十進制的負小數轉換成二進制的結果,然后把二進制負小數,三對一換成八進制數值即可。
八進制 → 十進制
八進制的正整數 → 十進制
就是八進制數和對應的位置的權數相乘,最后求和,就可以得到十進制數。這個叫「按權相加法」。
8進制的權數:80,81,82 ……
將八進制數12轉換成十進制數
將八進制數(751)8轉換成十進制數
(751)8=(7x82+5x81+1x80)10=(448+40+1)10=(489)10
八進制的小數 → 十進制數
小數位則從左向右開始算,依次列為第1、2、3………n,然后將第n位的數乘以8的-n次方,然后相加即可得到小數位的十進制數(按權相加法)。
八進制的0.16轉換成十進制是多少?
(0.16)8=(1x8-1+6x8-2)10=(0.125+0.09375)10=(0.21875)10
P.S 括號外的數字是注釋是多少進制的數,本來是應該打底標,但是CSDN不行
八進制的負整數 → 十進制
思路:
八進制負數轉成二進制數,再轉成十進制數
(37777777776) 8 = (11 111 111 111 111 111 111 111 111 111 110) 2
對11111111 11111111 11111111 1111110
取反+1,得到對應的正數補碼:
00000000 00000000 00000000 00000010 ,而這個正數補碼對應的十進制是2,所以11111111 11111111 11111111 1111110 對應的十進制數是-2,最后得到(37777777776) 8對應的十進制是-2
八進制的負小數 → 十進制
思路:
八進制負小數轉成二進制負小數,取反+1得到二進制正小數,再得到十進制的正小數,再得到十進制的負小數,這個十進制負小數就是八進制負小數轉換成十進制的結果值
十六進制和十進制的轉換
十六進制 → 十進制
十六進制正整數 → 十進制
將十六進制數(A7)16轉換成十進制數
「按權相加法」
十六進制的權數(從右到左):160,161,162…
(A7)16=(10x161+7x160)10=(160+7)10=(167)10
0x7fbe轉成十進制數
0x7fbe這個數是int類型,前面的0省略了,這是個正數,直接「按權相加」得到十進制數:
7 * 163 + 15 * 162 + 11 * 161 +14 * 160 = 32702
十六進制小數 → 十進制
以小數點為界,整數位從右向左開始算,依次列為第1、2、3………n,然后將第n位的數(0-9,A-F)乘以16的n-1次方,然后相加即可得到整數位的十進制數;小數位則從左向右開始算,依次列為第1、2、3………n,然后將第n位的數(0-9,A-F)乘以16的-n次方,然后相加即可得到小數位的十進制數(按權相加法)。
將十六進制數(0.D4)16轉換成十進制數
(0.D4)16=(13x16-1+4x16-2)10=(0.8125+0.015625)10=(0.828125)10
十六進制負整數 → 十進制
十六進制的負數,從字面量來看,不好直接看不出來到底是負數還是正數,而如果是負數,又不能直接通過「按權相加法」計算得到十進制數,所以保險起見,最好把十六進制的數先轉換成二進制數,然后通過二進制數的符號來判斷是否負數。
0xffffffdf轉成十進制是多少?
十六進制負小數 → 十進制
思路:
先轉成二進制補碼,如果確定是負數,取反+1,得到對應的正數補碼,正數補碼轉成十進制數,這個十進制的正數加個“負號”,就是十六進制負小數轉換成十進制的結果值。
十進制 → 十六進制
十進制正整數 → 十六進制
「除16取余法」:十進制數轉換成十六進制數,就是拿十進制數除以16,必須整除,得到的“商數”繼續除以16,直到“商數”為0,最后得到的余數逆排序就是對應的16進制數了。
將十進制數(93)10轉換成十六進制數
93/16=5………13(D)
5/16 = 0… … 5
(93)10=(5D)16
十進制小數 → 十六進制
「乘16取整法」
十進制小數轉換成16進制小數采用"乘16取整,順序排列"法。具體做法是:用16乘十進制小數,可以得到積,將積的整數部分取出,再用16乘余下的小數部分,又得到一個積,再將積的整數部分取出,如此進行,直到積中的小數部分為零,或者達到所要求的精度為止。
然后把取出的整數部分按順序排列起來,先取的整數作為16進制小數的高位,后取的整數作為低位,這樣由各整數部分組成的數字就是轉化后16進制小數的值。
將十進制數(0.3125)10轉換成十六進制數
0.3125x16 = 5 .0
(0.3125)10=(0.5)16
十進制負小數 → 十六進制
-15.8轉成十六進制是多少?
思路:
先得到-15.8的二進制數,再轉成十六進制數
整數通過「除2取余法」獲得,小數通過「乘2取整法」得
十進制負整數 → 十六進制
-33轉成十六進制是多少?
十進制的負數不能通過「除以16取余法」來轉換成十六進制。
必須先得到-33的二進制補碼:1101 1111,最后根據“十六進制與二進制的轉換關系表”,四位為一組替換成十六進制的值,最后得到結果:0xdf。但是這樣的結果是正確的嗎??-33 = 0xdf 嗎??
分析下0xdf:
字面量默認是int類型,32位,而0xdf只有8位,顯然是省略前面的0了,那么顯然這是個正數(前面提到不好直接看出來是否負數,可以轉成二進制判斷是否負數),可以直接通過「按權相加法」得到對應的十進制數:0xdf = 0x000000df = 13 * 16^1^+15 * 16^0^ = 208 + 15 = 223,所以0xdf != -33。
也就是說不論是-33還是0xdf,計算機都是當成int類型的數值,所以-33轉成二進制補碼應該是32位的,就是:11111111 11111111 11111111 11011111,那么轉成十六進制數就是:0xffffffdf。而0xdf轉成二進制數是:00000000 00000000 00000000 11011111
總結:
-33計算機認為是一個int類型的數值,會以32位的二進制表示:11111111 11111111 11111111 11011111,轉成十六進制就是:0xffffffdf。
0xdf計算機認為是一個int類型的數值,轉成二進制是:00000000 00000000 00000000 11011111,轉成十進制是:223。
實質上-33如果表示成8位的二進制補碼,再轉成十六進制的確是0xdf,只不過計算機不這么干,而0xdf轉成8位二進制補碼,再轉成十進制確實是-33,只是計算機不這么干。
所以0xdf
- 對應8位的二進制補碼而言,轉成十進制是-33
- 對應32位的二進制補碼而言,轉成十進制223
所以-33
- 對應8位的二進制補碼而言,轉成十六進制是0xdf
- 對應32位的二進制補碼而言,轉成十六進制是0xffffffdf
如果要把0xdf按8位的二進制補碼運算,需要強制類型轉換:
byte b = (byte)0xdf; System.out.println(b); // 結果輸出 -33二進制和八進制的轉換
八進制 → 二進制
二進制與八進制的互相轉換和二進制與十六進制的轉換類似,區別在于需要操作的是三位一組而不是四位。下表2-2列出了二進制與八進制的等效表示。
八進制正整數 → 二進制
八進制123換算成二進制的結果是多少?
為了把八進制數換算為二進制,將每一個八進制數字替換成表2-2中對應的二進制三位:
將八進制數(751)8轉換成二進制數
(751)8=(7 5 1)8=(111 101 001)2=(111101001)2
八進制小數 → 二進制
8進制17.36如何轉換成二進制
規則:按照順序,每1位八進制數改寫成等值的3位二進制數,次序不變。
(17.36)8 = (001 111 .011 110)2 = (1111.01111)2
將八進制數(0.16)8轉換成二進制數
(0.16)8=(0. 1 6)8=(0. 001 110)2=(0.00111)2
八進制負整數 → 二進制
(37777777776) 8怎么轉換成二進制
根據對照表將八進制的數逐一替換二進制數
(37777777776) 8 = (11 111 111 111 111 111 111 111 111 111 110) 2
八進制的負小數 → 二進制
思路:
根據對照表將八進制的數逐一替換二進制數即可
二進制 → 八進制
表述一:
整數部份從最低有效位開始,以3位一組,最高有效位不足3位時以0補齊,每一組均可轉換成一個八進制的值,轉換完畢就是八進制的整數。
小數部份從最高有效位開始,以3位一組,最低有效位不足3位時以0補齊,每一組均可轉換成一個八進制的值(表2-2查找對應的八進制值),轉換完畢就是八進制的小數。
表述二:
因為每三位二進制數對應一位八進制數,所以,以小數點為界,整數位則將二進制數從右向左每3位隔開,不足3位的在左邊用0填補即可;小數位則將二進制數從左向右每3位隔開,不足3位的在右邊用0填補即可。
二進制的正整數 → 八進制
將二進制數(10010) 2轉化成八進制數是多少?
(10010)2=(010 010)2=(2 2)8=(22)8
二進制小數 → 八進制
例1:將二進制數(0.1010)2轉化為八進制數。
(0.10101)2=(0. 101 010)2=(0. 5 2)8=(0.52)8
例2:將二進制數(11001111.01111)2 轉化成八進制數。(11001111.01111)2 = (011 001 111.011 110)2 = (317.36)8
二進制負整數 → 八進制
16位二進制補碼11111111 11110110 轉換成八進制
參照表2-2,將二進制的三位替換成對應的八進制數值即可。
(1111111111110110 ) 2 = (001 111 111 111 110 110) 2 = (177766) 8
二進制的負小數 → 八進制
思路:
根據對照表將二進制的數逐一替換八進制數
二進制和十六進制的轉換
二進制和十六進制的對照表
二進制 → 十六進制
因為每四位二進制數對應一位十六進制數,所以,以小數點為界,整數位則將二進制數從右向左每4位隔開,不足4位的在左邊用0填補即可;小數位則將二進制數從左向右每4位隔開,不足4位的在右邊用0填補即可。
二進制正整數 → 十六進制
0111 1101轉成十六進制數
不要管是否負數,直接根據對照表,4個二進制數對1個十六進制數,逐一替換即可。
(0111) 2 →(7)10 → (7)16
(1101)2 → (13)10 → (d)16
所以0111 1101 → 0x7d
其實不需要轉成十進制再轉成十六進制,因為對照表已經展示了二進制和十六進制的對應關系。
將二進制數(10010)2轉化成十六進制數
(10010)2 =(0001 0010)2 = (12) 16
二進制負整數 → 十六進制
1111 1101轉成十六進制數
1111 轉 f,1101 轉 d,結果0xfd。
二進制小數 → 十六進制
將二進制數(0.1010)2轉化為十六進制數
(0.10101)2=(0. 1010 1000)2=(0. A 8)16=(0.A8)16
二進制負小數 → 十六進制
直接根據對照表,4個二進制數對1個十六進制數,逐一替換即可。
十六進制 → 二進制
十六進制的正整數 → 二進制
將十六進制數(A7)16轉換成二進制數
0xa7,默認是int類型,前面0省略,肯定是正數,轉換的時候不必理會是否負數,直接轉即可
(A7)16=(A 7)16=(1010 0111)2=(10100111)2,注意這里不是8位的補碼,只是前面的0省略調了,這里可不是個負數,實際對應的十進制數是167。
0x7fd3 轉成二進制數
7 轉 0111
f 轉1111
d 轉 1101
3 轉 0011
結果:01111111 11010011
十六進制的負整數 → 二進制
根據對照表直接轉即可
十六進制的小數 → 二進制
將十六進制數(0.D4)16轉換成二進制數
根據對照表直接轉即可
(0.D4)16=(0. D 4)16=(0. 1101 0100)2=(0.110101)2
十六進制的負小數 → 二進制
根據對照表直接轉即可
八進制和十六進制的轉換
十六進制 → 八進制
先將十六進制轉換成二進制,然后再轉換成八進制
十六進制正整數 → 八進制
將十六進制數(A7)16轉換成八進制數
(A7)16=(10100111)2=(010 100 111)2=(247)8
十六進制小數 → 八進制
將十六進制數(0.D4)16轉換成八進制數
(0.D4)16=(0.1101 0100)2=(0. 110 101)2=(0.65)8
十六進制負整數 → 八進制
直接轉成二進制,再轉成八進制
十六進制負小數 → 八進制
直接轉成二進制,再轉成八進制
八進制 → 十六進制
八進制的正整數 → 十六進制
直接轉成二進制,再轉成十六進制
將八進制數(751)8轉換成十六進制數
(751)8=(111 101 001)2=(0001 1110 1001)2=(1 E 9)16=(1E9)16
八進制的正小數 → 十六進制
將八進制數(0.16)8轉換成十六進制數
(0.16)8=(0.001 110)2=(0. 0011 1000)2=(0.38)16
八進制的負整數 → 十六進制
根據「八進制與二進制對照表」轉成二進制,再根據「十六進制與二進制對照表」轉成十六進制
八進制的負小數 → 十六進制
根據「八進制與二進制對照表」轉成二進制,再根據「十六進制與二進制對照表」轉成十六進制
參考資料
總結
- 上一篇: MySQL如何删除有外键约束的数据
- 下一篇: 补码基础