您的位置:首页 > 其它

十进制转换二、八、十六进制

2016-05-24 11:58 190 查看
上一篇博客写到了十进制转十六进制的方法,主要思路是与运算后右移,得到要转换进制数的每一位数,然后存在一个临时数组中,再输出。其实十进制转八进制和二进制的方法大同小异,因此写一个类将这些功能整合在一起。

class Transform
{
/*
思路:二进制,八进制,十六进制的元素个数固定,而且还有对应编号,可以用查表法.
一个int类型十进制数在32位操作系统中占4个字节,32位2进制数,取它的低8位,例如60,在内存中以二进制数0011 1100存放,
而一个二进制数中每一位数对应二进制中1位数,一个八进制数中每一位数对应二进制中3位数,一个十六进制数中
每一位数对应二进制中4位数,因此可以将十进制数与对应要转换进制数的基数base(如二进制offset占1位,base为1;
八进制offset占三位,base为111;16进制offset占四位,base为1111;)进行“与(&)”运算,得出最低位,
然后左移偏移量offset继续与运算,直到原数等于0,得出所有位数,然后存在一个临时数组中,逆置输出
*/

/*
十进制-->二进制
十进制数在内存中是以二进制形式存放的,因此与1与运算后,
右移1位继续做与运算,直到原数为0.
*/
public static String toBinary(int num)
{
return trans(num,1,1);
}

/*
十进制-->八进制
内存中,一位八进制数等于三位二进制数,因此与7与运算后,
右移3位继续做与运算,直到原书为0.
*/
public static String toOctal(int num)
{
return "0"+trans(num,7,3);
}

/*
十进制-->十六进制
内存中,一位十六进制数等于四位二进制数,因此与15与运算后,
右移4位继续做与运算,直到原书为0.
*/
public static String toHex(int num)
{
return "0x"+trans(num,15,4);
}

//用于进制转换的功能
public static String trans(int num,int base,int offset)
{
//1.建表
char[] chs={'0','1','2','3',
'4','5','6','7',
'8','9','A','B',
'C','D','E','F'};

//2.创建存储2进制数的32位数的临时容器
char[] arr = new char[32];

//3.创建操作容器中每一位数的下标
int index =arr.length;

//4.通过循环对num进行&base,>>>offset操作,直到原数为0
while(num!=0)
{
//5.对num进行&运算得最低位数
int temp = num & base;
//6.根据&运算后的结果,作为下标,查表获取对应的字符,将它存储在临时容器中
//因为先求的是最低位,顺序是逆的,因此存储时逆存储
arr[--index] = chs[temp];
//7.对num进行右移,求次低位数
num = num >>>offset;
}
//8.调用方法,将数组转换成字符串输出
return toString(arr,index);
}

//9.定义一个方法,将数组转换成字符串
public static String toString(char[] arr,int index)
{
String temp = "";
for(int x=index;x<arr.length;x++)
{
temp = temp + arr[x];
}
return temp;
}

public static void main(String[] args)
{
int num = 60;
String str_bin = toBinary(num);
String str_oct = toOctal(num);
String str_hex = toHex(num);
System.out.println(str_bin);
System.out.println(str_oct);
System.out.println(str_hex);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: