閱讀304 返回首頁    go 阿裏雲 go 技術社區[雲棲]


HexConversion 二進製 八進製 十六進製 十進製

public class HexConversion {

		// TODO Auto-generated method stub
		/** 
	     * TODO 進製轉換。 
	     *  
	     * @param  cc
	     * https://yunpan.cn/QD8epsIs6YPXG
	     */  
	    public static void main(String[] args)  
	    {  
	        /** 
	         * 基本原理 二進製——>十進製 
	         *  
	         * 1101(2)=1*2^0+0*2^1+1*2^2+1*2^3=1+0+4+8=13 
	         *  
	         * 八進製——>十進製 
	         *  
	         * 1101(8)=1*8^0+0*8^1+1*8^2+1*8^3=1+0+64+512=577 
	         *  
	         * 425(8) = 5*8^0+2*8^1+4*8^2 = 5+16+256=277 
	         *  
	         * 十六進製——>十進製 
	         *  
	         * 1101(16)=1*16^0+0*16^1+1*16^2+1*16^3=1+256+4096=4353 
	         *  
	         * AF(16) = 15*16^0 + 10*16^1 = 15+160=175 
	         *  
	         * 二進製——>八進製 
	         *  
	         * (1100100)2=(001 100 100)2=(1 4 4)8=(9)2 
	         *  
	         * 二進製——>十六進製 
	         *  
	         * 1000 1001 1010 1011 1100 1101 1110 1111 =(89ABCDEF)16 
	         */  
	          
	        //十進製的10格式化成16進製輸出 "\n"換行  
	        System.out.printf("%x \n", 10);  
	  
	        /** 
	         * 十進製轉二進製 
	         *  
	         * 4的二進製為100,2等於10  
	         *  
	         * 十進製18等於二進製4*4+2 = 10000+10  
	         *  
	         * result 10010 
	         */  
	        System.out.println("數值:為18的十進製轉二進製:"+Integer.toBinaryString(18));  
	          
	        /** 
	         * 方法二: 
	         *  求102.8125的二進製 
	         * 根據十進製轉二進製換算 
	         * 25除以2   12餘1 
	         * 12除以2    6餘0 
	         * 6除以2     3餘0 
	         * 3除以2     1餘1 
	         * 1除以2     0餘1 
	         * 	十進製25的二進製為 11001 
	         *  
	         * 十進製0.8125的二進製為:  (0.1101)
	         * 小數乘以2,取整,小數部分繼續乘以2,取整,得到小數部分0為止,將整數順序排列 
	         * 。 
	         *               0.8125x2=1.625 取整1, 
	         *  
	         * 小數部分是0.625  0.625x2=1.25 取整1, 
	         *  
	         * 	    小數部分是0.25  0.25x2=0.5 取整0, 
	         *  
	         * 	 	 小數部分是0.5  0.5x2=1.0 取整1, 
	         * 	  	 			  小數部分是0,結束 
	         *  
	         * 102.8125的二進製 結果:11001.1101 
	         */  
	          
	          
	        /** 
	         * 二進製轉十進製 
	         */  
	        String v1 = "10010";  
	        System.out.println("數值:為10010的二進製轉十進製:"+Long.parseLong(v1,2));  
	        //法二:  
	        int r1 = (int)(0*Math.pow(2, 0)+1*Math.pow(2, 1)  
	                +0*Math.pow(2, 2)+0*Math.pow(2, 3)+1*Math.pow(2, 4));  
	        System.out.println("法二: 數值:為10010的二進製轉十進製:"+r1);  
	          
	          
	        /** 
	         * 十進製轉八進製  
	         *  
	         * 十進製18等於八進製8,8,2 ; 10+10+2=22 
	         *  
	         * result 22 
	         */  
	        System.out.println("數值:為18的十進製轉八進製:"+Integer.toOctalString(18));  
	  
	        /** 
	         * 八進製轉十進製 
	         */  
	        String v2 = "22";  
	        System.out.println("數值:為22的八進製轉十進製:"+Long.parseLong(v2,8));  
	        //法二:  
	        int r2 = (int)(2*Math.pow(8, 0)+2*Math.pow(8, 1));  
	        System.out.println("法二: 數值:為22的八進製轉十進製:"+r2);  
	          
	        /** 
	         * 十進製轉十六進製  
	         *  
	         * 十進製18等於十六進製16+2 
	         *  
	         * 十六進製16為10 
	         *  
	         * result 12 
	         */  
	        System.out.println("數值:為18的十進製轉十六進製 :"+Integer.toHexString(18));  
	        //法二:十六進製 xx*16的0次冪+xx*16的一次冪.......  
	          
	        /** 
	         * 二進製換算成八進製 
	         *  
	         * 2的3次冪為8,所以以每3位作為二進製換算成八進製的單位 
	         *  
	         * 如下100的二進製為4,110為6,101為5,1為1 
	         *  
	         * result 4+6+5+1 = 16 
	         */  
	         String v3 = "100 110 101 1";  
	          
	    }  
	}








二進製、八進製、十進製、十六進製之間轉換

一、 十進製與二進製之間的轉換
(1) 十進製轉換為二進製,分為整數部分和小數部分
① 整數部分
方法:除2取餘法,即每次將整數部分除以2,餘數為該位權上的數,而商繼續除以2,餘數又為上一個位權上的數,這個步驟一直持續下去,直到商為0為止,最後讀數時候,從最後一個餘數讀起,一直到最前麵的一個餘數。下麵舉例:
例:將十進製的168轉換為二進製

得出結果 將十進製的168轉換為二進製,(10101000)2
分析:第一步,將168除以2,商84,餘數為0。
第二步,將商84除以2,商42餘數為0。
第三步,將商42除以2,商21餘數為0。
第四步,將商21除以2,商10餘數為1。
第五步,將商10除以2,商5餘數為0。
第六步,將商5除以2,商2餘數為1。
第七步,將商2除以2,商1餘數為0。
第八步,將商1除以2,商0餘數為1。
第九步,讀數,因為最後一位是經過多次除以2才得到的,因此它是最高位,讀數字從最後的餘數向前讀,即10101000

(2) 小數部分
方法:乘2取整法,即將小數部分乘以2,然後取整數部分,剩下的小數部分繼續乘以2,然後取整數部分,剩下的小數部分又乘以2,一直取到小數部分
為零為止。如果永遠不能為零,就同十進製數的四舍五入一樣,按照要求保留多少位小數時,就根據後麵一位是0還是1,取舍,如果是零,舍掉,如果是1,向入一位。換句話說就是0舍1入。讀數要從前麵的整數讀到後麵的整數,下麵舉例:
例1:將0.125換算為二進製

得出結果:將0.125換算為二進製(0.001)2
分析:第一步,將0.125乘以2,得0.25,則整數部分為0,小數部分為0.25;
第二步, 將小數部分0.25乘以2,得0.5,則整數部分為0,小數部分為0.5;
第三步, 將小數部分0.5乘以2,得1.0,則整數部分為1,小數部分為0.0;
第四步,讀數,從第一位讀起,讀到最後一位,即為0.001。


例2,將0.45轉換為二進製(保留到小數點第四位)


大家從上麵步驟可以看出,當第五次做乘法時候,得到的結果是0.4,那麼小數部分繼續乘以2,得0.8,0.8又乘以2的,到1.6這樣一直乘下去,最後不可能得到小數部分為零,因此,這個時候隻好學習十進製的方法進行四舍五入了,但是二進製隻有0和1兩個,於是就出現0舍1入。這個也是計算機在轉換中會產生誤差,但是由於保留位數很多,精度很高,所以可以忽略不計。
那麼,我們可以得出結果將0.45轉換為二進製約等於0.0111
上麵介紹的方法是十進製轉換為為二進製的方法,需要大家注意的是:
1) 十進製轉換為二進製,需要分成整數和小數兩個部分分別轉換
2) 當轉換整數時,用的除2取餘法,而轉換小數時候,用的是乘2取整法
3) 注意他們的讀數方向
因此,我們從上麵的方法,我們可以得出十進製數168.125轉換為二進製為10101000.001,或者十進製數轉換為二進製數約等於10101000.0111。

(3) 二進製轉換為十進製 不分整數和小數部分
方法:按權相加法,即將二進製每位上的數乘以權,然後相加之和即是十進製數。例
將二進製數101.101轉換為十進製數。

得出結果:(101.101)2=(5.625)10
大家在做二進製轉換成十進製需要注意的是
1) 要知道二進製每位的權值
2) 要能求出每位的值


二、 二進製與八進製之間的轉換
首先,我們需要了解一個數學關係,即23=8,24=16,而八進製和十六進製是用這
關係衍生而來的,即用三位二進製表示一位八進製,用四位二進製表示一位十六進製數。
接著,記住4個數字8、4、2、1(23=8、22=4、21=2、20=1)。現在我們來練習二進製與八進製之間的轉換。
(1) 二進製轉換為八進製
方法:取三合一法,即從二進製的小數點為分界點,向左(向右)每三位取成一位,接著將這三位二進製按權相加,得到的數就是一位八位二進製數,然後,按順序進行排列,小數點的位置不變,得到的數字就是我們所求的八進製數。如果向左(向右)取三位後,取到最高(最低)位時候,如果無法湊足三位,可以在小數點最左邊(最右邊),即整數的最高位(最低位)添0,湊足三位。例
①將二進製數101110.101轉換為八進製

得到結果:將101110.101轉換為八進製為56.5

② 將二進製數1101.1轉換為八進製

得到結果:將1101.1轉換為八進製為15.4

(2) 將八進製轉換為二進製
方法:取一分三法,即將一位八進製數分解成三位二進製數,用三位二進製按權相加去湊這位八進製數,小數點位置照舊。例:
① 將八進製數67.54轉換為二進製

因此,將八進製數67.54轉換為二進製數為110111.101100,即110111.1011
大家從上麵這道題可以看出,計算八進製轉換為二進製
首先,將八進製按照從左到右,每位展開為三位,小數點位置不變
然後,按每位展開為22,21,20(即4、2、1)三位去做湊數,即a×22+ b×21 +c×20=該位上的數(a=1或者a=0,b=1或者b=0,c=1或者c=0),將abc排列就是該位的二進製數
接著,將每位上轉換成二進製數按順序排列
最後,就得到了八進製轉換成二進製的數字。
以上的方法就是二進製與八進製的互換,大家在做題的時候需要注意的是
1) 他們之間的互換是以一位與三位轉換,這個有別於二進製與十進製轉換
2) 大家在做添0和去0的時候要注意,是在小數點最左邊或者小數點的最右邊(即整數的最高位和小數的最低位)才能添0或者去0,否則將產生錯誤

三、 二進製與十六進製的轉換
方法:與二進製與八進製轉換相似,隻不過是一位(十六)與四位(二進製)的轉換,下麵具體講解
(1) 二進製轉換為十六進製
方法:取四合一法,即從二進製的小數點為分界點,向左(向右)每四位取成一位,接著將這四位二進製按權相加,得到的數就是一位十六位二進製數,然後,按順序進行排列,小數點的位置不變,得到的數字就是我們所求的十六進製數。如果向左(向右)取四位後,取到最高(最低)位時候,如果無法湊足四位,可以在小數點最左邊(最右邊),即整數的最高位(最低位)添0,湊足四位。
①例:將二進製11101001.1011轉換為十六進製

得到結果:將二進製11101001.1011轉換為十六進製為E9.B


② 例:將101011.101轉換為十六進製

因此得到結果:將二進製101011.101轉換為十六進製為2B.A



(2)將十六進製轉換為二進製
方法:取一分四法,即將一位十六進製數分解成四位二進製數,用四位二進製按權相加去湊這位十六進製數,小數點位置照舊。
①將十六進製6E.2轉換為二進製數

因此得到結果:將十六進製6E.2轉換為二進製為01101110.0010即110110.001

四、八進製與十六進製的轉換
方法:一般不能互相直接轉換,一般是將八進製(或十六進製)轉換為二進製,然後再將二進製轉換為十六進製(或八進製),小數點位置不變。那麼相應的轉換請參照上麵二進製與八進製的轉換和二進製與十六進製的轉


五、八進製與十進製的轉換
(1)八進製轉換為十進製
方法:按權相加法,即將八進製每位上的數乘以位權,然後相加之和即是十進製數。
例:①將八進製數67.35轉換為十進製

(2)十進製轉換為八進製
十進製轉換成八進製有兩種方法:
1)間接法:先將十進製轉換成二進製,然後將二進製又轉換成八進製
2)直接法:前麵我們講過,八進製是由二進製衍生而來的,因此我們可以采用與十進製轉換為二進製相類似的方法,還是整數部分的轉換和小數部分的轉換,下麵來具體講解一下:
①整數部分
方法:除8取餘法,即每次將整數部分除以8,餘數為該位權上的數,而商繼續除以8,餘數又為上一個位權上的數,這個步驟一直持續下去,直到商為0為止,最後讀數時候,從最後一個餘數起,一直到最前麵的一個餘數。
②小數部分
方法:乘8取整法,即將小數部分乘以8,然後取整數部分,剩下的小數部分繼續乘以8,然後取整數部分,剩下的小數部分又乘以8,一直取到小數部分為零為止。如果永遠不能為零,就同十進製數的四舍五入一樣,暫取個名字叫3舍4入。
例:將十進製數796.703125轉換為八進製數
解:先將這個數字分為整數部分796和小數部分0.703125
整數部分

小數部分

因此,得到結果十進製796.703125轉換八進製為1434.55
上麵的方法大家可以驗證一下,你可以先將十進製轉換,然後在轉換為八進製,這樣看得到的結果是否一樣

六、十六進製與十進製的轉換
十六進製與八進製有很多相似之處,大家可以參照上麵八進製與十進製的轉換自己試試這兩個進製之間的轉換。
通過上麵對各種進製之間的轉換,我們可以將前麵的轉換圖重新完善一下:


本文介紹了二進製、十進製、八進製、十六進製四種進製之間相互的轉換,大家在轉換的時候要注意轉換的方法,以及步驟,特別是十進製轉換為期於三種進製之間,要分為整數部分和小數部分,最後就是小數點的位置。但是要保證考試中不出現錯誤還是需要大家經常練習,這樣才能熟能生巧。







最後更新:2017-04-03 12:55:07

  上一篇:go .NET幾個重要概念
  下一篇:go JavaBean 反射機製實現自動配置數據