黑马程序员技术交流社区
标题:
说一说进制转换
[打印本页]
作者:
邓士林
时间:
2015-1-20 11:25
标题:
说一说进制转换
十进制与二进制的转换分析:(小数部分另谈)
思路:
利用辗转相除法不断除以2,求余数,然后将余数倒着打印即可。
例如:将十进制的168转换为二进制,(10101000)2
分析:第一步,将168除以2,商84,余数为0。
第二步,将商84除以2,商42余数为0。
第三步,将商42除以2,商21余数为0。
第四步,将商21除以2,商10余数为1。
第五步,将商10除以2,商5余数为0。
第六步,将商5除以2,商2余数为1。
第七步,将商2除以2,商1余数为0。
第八步,将商1除以2,商0余数为1。
第九步,读数,因为最后一位是经过多次除以2才得到的,因此它是最高位,读数字从最后的余数向前读,即10101000
通过以上例子,可以发现,通过辗转相除法可以讲十进制转换为二进制。
public static void converBinary(int value)
{
StringBuilder sb = new StringBuilder();
while(value)
{
int t = value % 2;
char chTemp;
if(t>=0 && t<=9)
{
chTemp = (char)(t + '0');
}
sb.append(chTemp);
}
System.out.println("二进制:" + sb.reverse());
}
复制代码
那么,如果我们通过二进制怎么转换为十进制呢?
public static int convertDecimal(String svalue)
{
int num =0,t = 0;
char [] ch =svalue.toCharArray();
for(int i=0;i<ch.length;i++)
{
if(ch[i] >= '0' && ch[i] <= '9')
{
t = ch[i] - '0';
}
num = num *2 +t; //二进制,基数乘以2
}
return num;
}
复制代码
既然我们有上面的互相转换代码,我们就可以写出十进制与二进制之间的相互转换功能,那么二进制、八进制、十六进制、十进制之间如何相互转换呢,参照以上思路我们可以写出。
public static StringBuilder convert(String srcValue,int srcHex,int tarHex)
{
int num =0;
int t = 0,i=0;
char[] ch = srcValue.toCharArray();
for(;i<ch.length;i++)
{
if(ch[i]>='0' && ch[i]<='9')
{
t = ch[i] - '0';
}
else if(ch[i] >= 'A' && ch[i] <= 'F')
{
t = ch[i] - 'A' + 10;
}
num = num * srcHex + t;
}
i = 0;
StringBuilder sb = new StringBuilder();
while(num != 0)
{
t = num % tarHex;
char chTemp;
if(t>=0 && t<=9)
{
chTemp = (char)(t + '0');
}
else
{
chTemp = (char)(t - 10 + 'A');
}
sb.append(chTemp);
num /= tarHex;
}
return sb;
}
复制代码
总结:
进制转换中我们可以巧妙利用StingBuilder来实现反转,避免了遍历数组的倒序输出。
另附以为哥们的代码,供大家学习。
//下面这三个方法分别转换成相应的进制。
public static void toBin(int num,int x)
{
System.out.print("您输入的"+x+"进制数的二进制形式是:");
trans(num,1,1);
}
public static void toOct(int num,int x)
{
System.out.print("您输入的"+x+"进制数的八进制形式是:");
trans(num,7,3);
}
public static void toHex(int num,int x)
{
System.out.print("您输入的"+x+"进制数的十六进制形式是:");
trans(num,15,4);
}
//trans():上边三个进制转换函数调用这个方法就可以完成进制的转换。
public static void trans(int num, int base, int offset)
{
if(num == 0)
{
System.out.println(0);
return;
}
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;
while(num != 0)
{
int temp = num & base;
arr[--pos] = chs[temp];
num = num >>> offset;
}
for(int i = pos; i < arr.length; i++)
{
System.out.print(arr[i]);
}
System.out.println();
System.out.println();
}
复制代码
10.png
(5.76 KB, 下载次数: 17)
下载附件
2015-1-20 11:25 上传
QQ截图20150119161340.png
(82.07 KB, 下载次数: 21)
下载附件
2015-1-20 11:25 上传
作者:
邓士林
时间:
2015-1-20 11:26
论坛中的图片,为什么不能放在指定的位置,而是添加到附件,放在最后呢?很不方便啊
作者:
fanshuai
时间:
2015-1-20 11:56
还没学到这里呢,呵呵。:lol
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2