對于進制,我們程序員都不陌生。我們常用的進制有2進制、8進制、10進制、16進制。它們之間的區別在于數運算時進位不同。2進制是逢2進1、8進制是逢8進1、10進制是逢10進1、16進制是逢16進1。2進制的存在是因為計算機只能識別0和1故有了2進制。10進制是因為我們常用的數字表示法是10進制。那么8進制和16進制為什么存在呢。為了減少書寫的復雜性和讀起來也更直觀引入了8進制和16進制。下面我們就看下這些進制之間是如何轉換的。
十進制轉二進制:
方法:十進制數除2取余法,即十進制數除2,余數從右到左放,得到的商值繼續除2,依此步驟繼續向下運算直到商為0為止。
如:100 轉換為2進制步驟如下:
100 / 2 商為50 余數為0 -> 0
50 /2 商為25余數為0 -> 00
25 /2 商為12余數為1 -> 100
12 / 2 商為6 余數為0 -> 0100
6 /2 商為3余數為 0 -> 00100
3 /2 商為1 余數為 1 -> 100100
1 /2 商為0 余數為1 -> 1100100
到商為0為止,即100的二進制表示為 1100100
二進制轉十進制:
方法:把二進制數每位按權展開(按權展開:進制數乘以對應的權數次方,如二進制數1100100左邊第一位按權展開為 0 * 2 ^ 0 = 0 )、相加即得十進制數。其中權就是從右往左數第幾位數
如1100100從右往左每位數的權依次為:0、1、2、3、4、5、6
那么把2進制1100100轉換為10進制就是 02^0 + 02^1 + 12^2 + 02^3 + 02^4 +12^5 + 1*2^6 = 0+0+4+0+0+32+64 = 100 ,即2進制1100100對應的10進制數為100
二進制轉八進制
方法:從右往左每3位二進制數按權展開(注意三位的權分別為0、1、2)相加得到1位八進制數。不足3位左邊補0.
如1100100 轉換為8進制就是
右邊3位 100 -> 02^0 + 02^1 + 12^2 = 4
中間3位 100 -> 02^0 + 02^1 + 12^2 = 4
左邊3位 001 -> 12^0 + 02^1 + 0*2^2 = 1
所以1100100轉換為8進制為 144
八進制轉二進制
方法:八進制數每位數通過除2取余法,得到二進制數,對每個八進制為3個二進制位,不足時在最左邊補零。
如8進制144轉換為2進制
第一個8進制位:4 按十進制轉二進制計算得 100
第二個8進制位:4 按十進制轉二進制計算得 100
第三個8進制位:1 按十進制轉二進制計算得 1 不足3位左邊補0,即001
故八進制144轉換為2進制為 001100100習慣上去掉左邊的0即為1100100
二進制轉十六進制
方法:與二進制轉八進制方法近似,八進制是取三合一,十六進制是取四合一。4位二進制轉成十六進制是從右到左開始轉換,不足時補0
如:1100100轉換為16進制
右邊4位 0100 -> 02^0 + 02^1 + 12^2 +02^3 = 4
左邊4位0110 -> 02^0 + 12^1 +12^2 +02^3 = 6
1100100轉換為16進制為 64
十六進制轉二進制
方法:十六進制數每位數通過除2取余法,得到二進制數,對每個十六進制為4個二進制位,不足時在最左邊補零。
如16進制64轉換為2進制
第一個16進制位: 4 按十進制轉二進制計算得 100,不足4位左邊補0,即0100
第二個16進制位: 6按十進制轉二進制計算得 110,不足4位左邊補0,即0110
故16進制64轉換為2進制為 01100100習慣上去掉左邊的0即為1100100
十進制轉八進制
方法1:十進制轉換為二進制,然后二進制換為8進制
方法2:把十進制轉八進制按照除8取余,余數從右至左放,直到商為0為止。
如:10進制100轉換為8進制
100 / 8 商為12 余數為 4 -> 4
12 / 8 商為1 余數為 4 -> 44
1 / 8 商為0 余數為 1 -> 144
到商為0為止,即100的8進制表示為 144
十進制轉十六進制
方法1:十進制轉換為二進制,然后二進制換為十六進制
方法2:把十進制轉十六進制按照除16取余,余數從右至左放,直到商為0為止。
如:10進制100轉換為16進制
100 / 16 商為6 余數為 4 -> 4
6 / 16 商為0 余數為 6 -> 64
到商為0為止,即100的16進制表示為 64
八進制轉十進制
方法:把八進制數每位按權展開(按權展開:進制數乘以對應的權數次方,如八進制數144左邊第一位按權展開為 4 * 8 ^ 0 = 4 )、相加即得十進制數。
如:八進制 144轉換為10進制, 4* 8 ^ 0 + 4 * 8 ^ 1 +1 * 8 ^ 2 = 4 + 32 + 64 = 100
十六進制轉10進制
方法:把十六進制數每位按權展開(按權展開:進制數乘以對應的權數次方,如十六進制數64左邊第一位按權展開為 4 * 16 ^ 0 = 4 )、相加即得十進制數。
如:十六進制數64轉換為10進制, 4 * 16 ^0 + 6 * 16 ^ 1 = 4 + 96 = 100
八進制與十六進制互轉
方法一:八進制(十六進制)先轉換為二進制,然后二進制再轉換為十六進制(八進制)
方法二:八進制(十六進制)先轉換為十進制,然后十進制再轉換為十六進制(八進制)
十進制轉換為其它進制
方法:把十進制轉其它進制按照除進制數取余,余數從右至左放,直到商為0為止。
如:10進制100轉換為7進制(其它進制類似)
100 / 7 商為14 余數為 2 -> 2
14 / 7 商為2 余數為0 -> 02
2 / 7 商為0 余數為 2 -> 202
到商為0為止,即100的7進制表示為 202
其它進制轉換為10進制
方法:把其它進制數每位按權展開(按權展開:進制數乘以對應的權數次方,如七進制數202左邊第一位按權展開為 2 * 7 ^ 0 = 2 )、相加即得十進制數。
如:7進制202轉換為10進制,2 * 7 ^ 0 + 0 * 7 ^ 1 + 2 * 7 ^ 2 = 2 + 0 + 98 = 100
至此各進制之間的轉換就到此結束了,下面我們看下java中是如何進行這些進制轉換。
十進制轉其它進制
Integer.toHexString(10); 將10進制100轉換為十六進制,返回字符串類型
Integer.toOctalString(10); 將10進制100轉為八進制,返回字符串類型
Integer.toBinaryString(10); 將10進制100轉為二進制,返回字符串類型
Integer.toString(100, 7); 將10進制100轉換為7進制,返回字符串類型,其它第一個參數為待轉換的10進制數,第二個參數是需要轉換的進制。
其它進制轉換為十進制
方法一:Integer.valueOf("FFFF",16).toString(); 例為16進制轉換為10進制,如果是其它進制第二個參數傳進制數,第一個參數傳對應的進制表示法
方法二:Integer.parseInt("FFFF",16); 例為16進制轉換為10進制,如果是其它進制第二個參數傳進制數,第一個參數傳對應的進制表示法
方法三:Integer.toString(0xFFFF); //該方法可直接傳入表示十六進制數字的基本數據類型,傳入指定的進制表示法的數字即可,16進制表示法:數前面加 0x如0xff,8進制表示法數前面加0如014,注意該方法無法轉換為2進制數,程序無法識別2進制,比如你傳100,程序是當10進制100處理還是當2進制4處理,有歧義,故無法識別,程序默認是按10進制數處理的
有了十進制和其它進制之間的轉換,那么兩個其它進制之間的轉換只需要以10進制為中介就可以了,如八進制轉換為十六進制,先將八進制轉換為十進制,然后再將十進制轉換為十六進制。其它類似。