------- android培训、java培训、期待与您交流! ----------
平时使用中,进制转换只要使用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)得出。
基于以上的分析,可以设计一下代码:
class Transform
{
public static void main(String[] args)
{
toHex(60);
toba(60);
toBin(60);
}
//十进制转二进制
public static void toBin (int num)
{
trans(num,1,1);
}
//十进制转八进制
public static void toba (int num)
{
trans(num,7,3);
}
//十进制转十六进制
public static void toHex (int num)
{
trans(num,15,4);
}
// 具体转换过程。
// 方法中第一个参数为需要转换的数 ,第二参数为位运算&上的数,第三个参数为要移动的二进制位。
public static void trans (int num,int base,int offset)
{
// 定义一个数组,角标对应数值,可以看做一个查询表。
char[] chs = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
char[] arr = new char[32];
int pos = arr.length;
if(num==0)
{
// 如果要转换的数为0,则无需转换。
System.out.println(0);
}
while(num!=0)
{
// 得出指定进制中每一位的数值,存入一个数组中。
int temp = num & base;
arr[--pos] = chs[temp];
// 每得出一个指定进制一个位上的值后,原数值的二进制位就往右移动指定位数,并在前面补零。
num = num >>> offset; //移位补零。
}
for(int x=pos;x<arr.length;x++)
{
if (x==(arr.length-1)) {
System.out.println(arr[x]);
} else {
System.out.print(arr[x]);
}
}
}
}