黑马程序员技术交流社区
标题:
关于进制转换的代码,请指教
[打印本页]
作者:
doyxy
时间:
2013-12-27 12:40
标题:
关于进制转换的代码,请指教
本帖最后由 doyxy 于 2013-12-28 08:53 编辑
今天写了十进制转换为二进制,八进制,十六进制的代码,大家帮忙看下有没有什么问题呢?谢谢
主要是32行
for (int x=0; x<(32/offset+1) ; x++ )//二进制最高32位,八进制最高11位,十六进制最高8位
八进制整除不了,为这里加了1,但是这样二进制和十六进制的位数多1了,有没有什么更好的解决方法呢?
有效代码到42行,后面的是我之前写的,已经注释掉了
class ArrayTest5
{
public static void main(String[] args)
{
toBin(-60);
toOct(-60);
toHex(-60);
}
//二进制
public static void toBin(int num)
{
trans(num,1,1);
}
//八进制
public static void toOct(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)
//base为被与数,二进制为1,八进制为7,十六进制为15
//offset为右移位数,二进制为1,八进制为3,十六进制为4
{
char[] arr = {'0','1','2','3','4','5','6','7',
'8','9','A','B','C','D','E','F'};
StringBuffer sb = new StringBuffer();
for (int x=0; x<(32/offset+1) ; x++ )//二进制最高32位,八进制最高11位,十六进制最高8位
{
int temp = num&base;
sb.append(arr[temp]);
num = num>>>offset;
if (num==0)//右移后如果数值为0则跳出
break;
}
System.out.println(sb.reverse());
}
/*
//将十进制转换为二进制
//思路:十进制转为二进制是不停模2的过程,最后一位模完为0,则可以设置当num>0时循环
public static void toBin(int num)
{
StringBuffer sb = new StringBuffer();
while (num>0)
{
sb.append(num%2);
//System.out.print(num%2);
num = num/2;
}
System.out.println(sb.reverse());
}
//十进制转换为二进制的改进,上面的代码不能转换负数
public static void toBin_2(int num)
{
StringBuffer sb = new StringBuffer();
for (int x=0; x<32 ; x++ )
{
int temp = num & 1;
sb.append(temp);
num = num>>>1;
if (num == 0)
break;
}
System.out.println(sb.reverse());
}
//将十进制转换为十六进制
//思路:十进制转换为十六进制,分别取得最后4位二进制位并转换为十六进制位,即num&15;
public static void toHex(int num)
{
StringBuffer sb = new StringBuffer();
for (int x=0;x<8;x++ )
{
int temp = num&15;
if (temp>9)
//System.out.println((char)(temp-10+'A'));
sb.append((char)(temp-10+'A'));
else
//System.out.println(temp);
sb.append(temp);
num = num>>>4;
if (num==0)//右移4位后如果数值为0则跳出
break;
}
System.out.println(sb.reverse());
}
//查表法:定义一个数组,即将0-F依次存入,则num&15后的值即为对应角标,输出arr[temp]即可
public static void toHex_2(int num)
{
char[] arr = {'0','1','2','3','4','5','6','7',
'8','9','A','B','C','D','E','F'};
StringBuffer sb = new StringBuffer();
for (int x=0; x<8 ; x++ )//8*4个二进制位,每4位一组,所以x<8
{
int temp = num&15;
sb.append(arr[temp]);
num = num>>>4;
if (num==0)//右移4位后如果数值为0则跳出
break;
}
System.out.println(sb.reverse());
}
*/
}
复制代码
作者:
776699
时间:
2013-12-27 12:59
没有问题
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2