平时使用中,进制转换只要使用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 }
时间: 2024-11-06 03:30:53