java里面是有進制間互換現成的方法的:
public class 十進制與各進制的相互轉換 { public static void main(String[] args){ //java已經實現的機制:十進制轉換為二進制 int decimal = 10; System.out.println("十進制數:"+decimal+",轉換為二進制:"+Integer.toBinaryString(decimal)); System.out.println("十進制數:"+decimal+",轉換為八進制:"+Integer.toOctalString(decimal)); System.out.println("十進制數:"+decimal+",轉換為十六進制:"+Integer.toHexString(decimal)); System.out.println("二進制數:"+"1010" +",轉換為十進制:"+Integer.valueOf("1010", 2)); System.out.println("八進制數:"+"12" +",轉換為十進制:"+Integer.valueOf("12", 8)); System.out.println("十六進制數:"+"a" +",轉換為十進制:"+Integer.valueOf("a", 16)); } }
結果:
十進制數:10,轉換為二進制:1010 十進制數:10,轉換為八進制:12 十進制數:10,轉換為十六進制:a 二進制數:1010,轉換為十進制:10 八進制數:12,轉換為十進制:10 十六進制數:a,轉換為十進制:10
但如果不取Integer的內含方法,我們要怎么實現進制之間的轉換呢?
下面針對二進制-->十進制實現其算法過程:
一般思維:
當問到二進制數轉為十進制數,大多數人腦里第一反應的應該是這樣一個邏輯過程:
二進制數:1010
十進制數:1*2^3 + 0*2^2 + 1*2^1 + 0*2^0 = 8 + 0 + 2 +0 = 10
按這個思路,java代碼可以這樣實現:
方法一:
public int binaryToDecimal(String inMsg){ int x = 0; int mul = 1; for(int i = inMsg.length()-1;i>0;i--){ x += mul*(inMsg.charAt(i)=='1'?1:0); mul*=2; } System.out.println(mul); return mul; }
好奇在網上也找了下其他實現方法:
方法二:
String radix = "1010";
public int method(String radix){ int x = 0; for(char c:radix.toCharArray()) x = x*2 + (c=='1'?1:0); System.out.println(x); return x; }
對比以上兩個方法,方法一和我們平常的思維是一致的,但是方法二就不大好理解了,略作思考后,發現可以這樣理解:
1、從for(char c:radix.toCharArray())這行代碼可以看出,需要將待求解的二進制數轉換為char數組;顯然,當待求解二進制數為1010時,char數組即為:char[1,0,1,0],數組中有4個元素,那么也就是說for循環要循環運行4次。
2、顯而易見,for循環里面的算式組成部分的(c=='1'?1:0)目的就是為了拿到當前循環時對應二進制數組下標的值。
如:第一次循環,拿到二進制數組下標為0的值:1
第二次循環,拿到二進制數組下標為1的值:0
第三次循環,拿到二進制數組下標為2的值:1
第四次循環,拿到二進制數組下標為3的值:0
3、算法:x = x*2 + (c=='1'?1:0) 的原理解析:前半部分x*2,是為了實現二進制數組元素的冪次相乘(之前的int x = 0其實實現了char[]數組的size()-1的作用),后半部分獲取了下次進行冪運算的char數組的元素值。
解析:
第一次循環:看方法二的第三行代碼:int x = 0;x初始值為0,就導致了for循環第一次循環時,運算為:0*2+1 ,即只會得到算式(c=='1'?1:0)的值,即二進制數組第一個元素的值:1 ;這時循環已經進行了1次,還剩3次,所以這里的1會在后面的3次循環里分別乘以2 , 即1*2*2*2;
第二次循環:算式為: (0*2 + 1)*2 + 0 == 0*2*2 + 1*2 + 0 ,第一部分0*2*2不用管,因為這個是int x=0起作用用的, 第二部分是第一次循環時得到1的第一次冪運算1*2, 第三部分就是二進制數組下標為1的元素:0,也是下一次循環會進行冪運算的數。 這時我們發現總共的4次循環已經進行了2次,剩下2次,所以這里的下次冪運算值:0會在后面的2次循環里分別乘以2,即0*2*2;
第三次循環:算式為: ((0*2 + 1)*2 + 0)*2 +1 == 0*2*2*2 + 1*2*2 + 0*2 +1 ,第一部分0*2*2*2不用管,第二部分是第一次循環時得到1的第二次冪運算1*2*2, 第三部分是第二次循環時得到0的第一次冪運算0*2,第四部分就是二進制數組下標為2的元素:1,也是下一次循環會進行冪運算的數。 這時我們發現總共的4次循環已經進行了3次,剩下1次,所以這里的下次冪運算值:1會在后面的1次循環里乘以2,即1*2;
第四次循環:算式為: (((0*2 + 1)*2 + 0)*2 +1 )*2 +1 == 0*2*2*2*2 + 1*2*2*2 + 0*2*2 +1*2 + 0 ,第一部分0*2*2*2*2不用管,第二部分是第一次循環時得到1的第三次冪運算1*2*2*2, 第三部分是第二次循環時得到0的第二次冪運算0*2*2,第四部分是第三次循環時得到1的第一次冪運算1*2,第五部分就是二進制數組下標為3的元素:0,也是下一次循環會進行冪運算的數。 這時我們發現總共的4次循環已經進行了4次,剩下0次,
所以本次運算就是整個算法的結果: 0*2*2*2*2 + 1*2*2*2 + 0*2*2 + 1*2 + 0 = 0 + 8 + 0 + 2 + 0 = 10 ,這樣看是不是覺得很熟悉!沒錯,其實原理還是和方法一一樣樣的。
啰嗦了點,希望能幫到你理解!:)