主要是利用查表法来进行数制转换,利用一个数组存储非十进制的各种符号,在用“与”操作把每一位数取出来通过查表得出转换后的字符并存入另一个数组中,最后打印出这个数组中的内容就完成了数制转换。
public static String toBin(int num)
{
//用数组来存放所需要查询的表
char[] chs = {'0','1'};
//用一个数组来存放转换后的数字,整型参数有4个字节,最大32个bit
char[] arr = new char[32];
//pos用来指示放在arr中数字的位置,从最后一个开始放起可以避免输出时反向。
int pos = arr.length;
String s = new String();
if(num == 0)
return "";
while(num != 0)
{
//每次取一位,将取到的1位放到arr数组里,从arr数组的最后一位开始放起
int temp = num & 1;
//用--pos可以使pos总是指向有数字的位置,因为数组中无数值的部分是“空”,
//此时初始化pos的时候就不能为length-1,否则到0位置的时候就会出错!
arr[--pos] = chs[temp];
num = num >>> 1;
} for(int i = pos;i
上面的程序实现了从十进制转换到二进制的功能,使用“与”操作+右移操作可以在不区分正负数的情况下进行转换,负数转换的结果也很正确。同理可以得出十进制转十六进制的方法。
public static String toHex(int num)
{
//用数组来存放所需要查询的表
char[] chs = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
//用一个数组来存放转换后的数字,整型参数有4个字节,最大32个bit
char[] arr = new char[32];
//pos用来指示放在arr中数字的位置,从最后一个开始放起可以避免输出时反向。
int pos = arr.length;
String s = new String();
if(num == 0)
return "";
while(num != 0)
{
//每次取一位,将取到的1位放到arr数组里,从arr数组的最后一位开始放起
int temp = num & 15;
//用--pos可以使pos总是指向有数字的位置,因为数组中无数值的部分是“空”,
//此时初始化pos的时候就不能为length-1,否则到0位置的时候就会出错!
arr[--pos] = chs[temp];
num = num >>> 4;
}
for(int i = pos;i
从这两个程序发现,两个函数数值转换的主要部分的操作基本上是一样的,因此我们可以将相同的部分提取出来,写成一个函数,再用这个函数实现各种数值的转换!转换函数入下:
/*
* 十进制数转换功能,base表示基数,2进制为1,8进制为7,16进制为15;
* offset表示每次与之后的偏移量,2进制为1,8进制为3,16进制为4
*/
public static String 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'};
//用一个数组来存放转换后的数字,整型参数有4个字节,最大32个bit
char[] arr = new char[32];
//pos用来指示放在arr中数字的位置,从最后一个开始放起可以避免输出时反向。
int pos = arr.length;
String s = new String();
if(num == 0)
return "";
while(num != 0)
{
//每次取一位,将取到的1位放到arr数组里,从arr数组的最后一位开始放起
int temp = num & base;
//用--pos可以使pos总是指向有数字的位置,因为数组中无数值的部分是“空”,
//此时初始化pos的时候就不能为length-1,否则到0位置的时候就会出错!
arr[--pos] = chs[temp];
num = num >>> offset;
}
for(int i = pos;i }
return s;
}
最后各种转换入下:
/*
* 十进制数转8进制数
*/
public static String toOx(int num)
{
return trans(num,7,3);
}
/*
* 十进制数转2进制数
*/
public static String toOx(int num)
{
return trans(num,1,1);
}
/*
* 十进制数转16进制数
*/
public static String toOx(int num)
{
return trans(num,15,4);
}