java中的进制转换

编写一个方法,将十进制的数以十六进制的形式打印出来
public static void toHex(int num) {
for (int x=0;x<8;x++) {
int temp=num&15;
if(tmep>9) {
System.out.println((char)(temp-10+‘A’));
}else {
System.out.println(temp);
}
num=num>>>4;
}

分析
什么时候使用数组呢?
如果数据出现了对应关系,而且对应关系中的一方是有序数字编号,并作为角标使用。这时就必须要想到数组的使用
0,1,2,3,4,5,6,7,8,9, A, B, C, D, E, F
0,1,2,3,4,5,6,7,8,9,10, 11, 12, 13, 14, 15
分析上面两组数列的对应关系, 就可以将这些0F这些数据存到到数组中,数组对应的角标就是015。
最后根据运算结果,直接通过数组角标找到对应的十六进制数值。
这种方式称为:查表法
//定义一个关系表。
public static void toHex(int num) {
char[] chs={‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’,‘A’,‘B’,‘C’,‘D’,‘E’,‘F’};
for (int x=0;x<8;x++) {
int temp=num&15;
System.out.println(chs[temp]);
num=num>>>4;
}
继续分析: 这时打印出来的十六进制数据值存在两个问题:
1、显示顺序反了
2、高位为0的情况下,0可以省略不写 。
因为在查表的时候会查到比较多的数据,数据一多,就先存储起来,再进行操作,所以可以先临时定义一个数组,作为容器。
public static void toHex(int num) {
char[] chs={‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’,‘A’,‘B’,‘C’,‘D’,‘E’,‘F’};
char[] arr =new char[8]; //定义一个容器数组
int pos=0: //数组的角标赋值0
while(num!=0)
{
int temp=num&15;
arr[pos++]=chs[temp];
num=num>>>4;
}
for(int x=0;x<pos; x++)
{
System.out.print(arr[x]);
}
继续分析:
1、此时结果已经没有了无效位的0,
2、但是结果值的顺序还是反的。
思路:因为作为临时存储的数组容器arr 。他的角标默认是从0开始往上增加的,所以会导致输出结果的顺序反了。
【解决方法:】
1、写for语句的循环打印输出命令时,可以将x的初始值换为从临时容器数组的最高位角标开始,直到角标位为0结束。
public static void main(String[] args) {
toHex(253);
}
public static void toHex(int num) {
char[] chs={‘0’,‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’,‘A’,‘B’,‘C’,‘D’,‘E’,‘F’};
char[] arr =new char[8]; //定义一个容器数组
int pos=0; //数组的角标赋值0
while(num!=0)
{
int temp=num&15;
arr[pos++]=chs[temp];
num=num>>>4;
}
for(int x=pos;x>=0; x–)
{
System.out.print(arr[x]);
}
}
2、可以将pos的初值设置为临时数组arr的长度减1. 那么最终打印时只需要从数组有效位(pos所指向的地址)开始向后打印即可。
public static void main(String[] args) {
toHex(253);
}
public static void toHex(int num) {
char[] chs={‘0’,‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’,‘A’,‘B’,‘C’,‘D’,‘E’,‘F’};
char[] arr =new char[8]; //定义一个容器数组
int pos=arr.length-1; //数组的角标赋值0
while(num!=0)
{
int temp=num&15;
arr[pos–]=chs[temp];
num=num>>>4;
}
for(int x=pos;x<arr.length; x++)
{
System.out.print(arr[x]);
}
}

进制转换(整合)
public class numberBaseConversion {
public static void main(String[] args) {
toHex(32);
toBinary(20);
toOctal(16);
}
// 根据toConversion方法模板,快速生成各种进制转换的方法
public static void toHex(int num) {
toConversion(num,15,4);
}
public static void toOctal(int num) {
toConversion(num,7,3);
}
public static void toBinary(int num) {
toConversion(num,1,1);
}

// 各种进制之间转换方法的模板
public static void toConversion(int num,int base,int offset) {
char[] a={‘0’,‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’,‘A’,‘B’,‘C’,‘D’,‘E’,‘F’};
char[] b=new char [32];
int p=0;
if (num==0) {
System.out.println(“0”);
return;
}
while(num!=0) {
int temp=num&base;
b[p++]=a[temp];
num=num>>>offset;
}
for(int i=p-1;i>=0;i–) {
System.out.print(b[i]);
}
System.out.println();
}
}
其实java已经给我们做好了一个进制转换的函数:
System.out.println(Integer.toBinaryString(20));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值