標籤:
平時使用中,進位轉換隻要使用Integer這個封裝類中的方法即可完成。
但其實我們也能用自己的方法去實現,這有助於初學者對於電腦底層運算的理解。下面例子使用了查表形式的方法來完成的進位的轉換。
在開始前,需要先理解清楚各個進位的特點還有位的概念。
眾所周知,在電腦中,記憶體儲存的都是二進位的資料,即通過0,1來表示資料的內容。
位(bit)就是代表位元據個中的每一個0或1,bit是電腦中的最小單位。
需要注意的是電腦基本存放裝置單位是位元組(byte),它用8個二進位位表示,即1 byte = 8 bit。
java可以支援八進位,十進位,十六進位的表示,分別是:
八進位:前置0,如用八進位表示5要寫成05。
十進位:不需前置,如5就是十進位中的5.
十六進位:前置0x或者0X,如用十六進位表示5要寫成0x5。
如果產生值為60的int類型的資料,它在記憶體會佔用32位的空間。如下所示:
0000-0000 0000-0000 0000-0000 0011-1100
十六進位的數值用0~9和A~F這16個數來表示,當滿足16,則進位。60在java中用十六進位來表示為:0x3C,在記憶體中表現為:
八進位的數值用0~7這8個數來表示,當滿足8,則進位。60在java中用八進位來表示為:074,在記憶體中表現為:
從以上規律可以看出,二進位中每4個位(2的4次冪=16),就表示十六進位中1個位,而要得出16進位位上的數值,可以使用位元運算 & 15(位元1111)得出。
同理,二進位中每3個位(2的3次冪=8),就表示八進位中1個位,而要得出8進位位上的數值,可以使用位元運算 & 7(位元111)得出。
基於以上的分析,可以設計一下代碼:
1 class Transform 2 { 3 public static void main(String[] args) 4 { 5 toHex(60); 6 toba(60); 7 toBin(60); 8 } 9 10 //十進位轉二進位11 public static void toBin (int num)12 {13 trans(num,1,1);14 }15 16 //十進位轉八進位17 public static void toba (int num)18 {19 trans(num,7,3);20 }21 22 //十進位轉十六進位23 public static void toHex (int num)24 {25 trans(num,15,4);26 }27 28 // 具體轉換過程。29 // 方法中第一個參數為需要轉換的數 ,第二參數為位元運算&上的數,第三個參數為要移動的二進位位。30 public static void trans (int num,int base,int offset)31 {32 // 定義一個數組,角標對應數值,可以看做一個查詢表。33 char[] chs = {‘0‘,‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘,‘8‘,‘9‘,‘a‘,‘b‘,‘c‘,‘d‘,‘e‘,‘f‘};34 char[] arr = new char[32];35 int pos = arr.length;36 37 if(num==0)38 {39 // 如果要轉換的數為0,則無需轉換。40 System.out.println(0);41 }42 43 while(num!=0)44 {45 // 得出指定進位中每一位的數值,存入一個數組中。46 int temp = num & base;47 arr[--pos] = chs[temp];48 // 每得出一個指定進位一個位上的值後,原數值的二進位位就往右移動指定位元,並在前面補零。49 num = num >>> offset; //移位補零。50 }51 52 for(int x=pos;x<arr.length;x++)53 {54 if (x==(arr.length-1)) {55 System.out.println(arr[x]); 56 } else {57 System.out.print(arr[x]); 58 }59 }60 }61 }
Java基礎:十進位轉換其他進位