黑马程序员技术交流社区

标题: 各位大神啊 这个进制转换有没有更优化的方式 [打印本页]

作者: 朱志江    时间: 2013-3-25 14:44
标题: 各位大神啊 这个进制转换有没有更优化的方式
本帖最后由 朱志江 于 2013-3-26 01:19 编辑

/*
需求:要一个十进制和其它进制之间转换的程序

思想:1、因为进制之间的转换都用相同的程序代码
                 为了提高函数的复用性和简便写法
                 要把这些相同的代码给封装定义起来以提高效率
          2、定义一个函数把代码给简化封装

步骤:1、定义一个函数返回值类型是void
          2、定义一个char类型的数组
          3、用while循环来对数值查表和记录
*/

class Jinzhijh//进制提高复用性的集合优化算法
{
        public static void main(String[] args)
        {
                //tobin(6);
                tooctal(0);
                //tohex(60);

        }

        //十进制转二进制
        public static void tobin(int num)
        {
                trans(num,1,1);//代码抽取  前1代表基数 后1代表右移位数 下同
        }


        //十进制转八进制
        public static void tooctal(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)//定义数字 基数 和移动位数
        {
                if (num==0)//判断语句 如果输入的数字是零 那么就不进行运算 直接返回
                {
                        System.out.print(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)        //用while来进行运转
                {
                        int temp =num & base;
                        arr[--pos] = chs[temp];
                        num = num >>> offset;
                }

                for (int x=pos;x<arr.length ;x++ )
                {
                        System.out.print(arr[x]);
                }
        }
}
最后一句的 for循环语句能不能不用   就是把转换的值先记录下来 然后直接打印出来
作者: 陈圳    时间: 2013-3-25 16:16
  1. public class Program3 {

  2.         /**任意进制转换方法
  3.          * @param args
  4.          */
  5.         public static void main(String[] args) {
  6.                 // TODO Auto-generated method stub
  7.                 System.out.println(changeNum(60,16));
  8.         }
  9.         public static String changeNum(int num,int base){
  10.                 char[] checkList={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
  11.                 StringBuilder numBuilder=new StringBuilder();
  12.                 while(num!=0){
  13.                         numBuilder.append(checkList[num%base]);
  14.                        
  15.                         num/=base;
  16.                 }
  17.                 return numBuilder.reverse().toString();
  18.         }
  19. }
复制代码

作者: 贾振凯    时间: 2013-3-25 19:03
本帖最后由 贾振凯 于 2013-3-25 19:05 编辑

import static java.lang.Math.log10;
/**
* 可以完成任意进制转换
  * @param num 要转换的目标和数
  * @param base 进制的选择参数 2,8,16
  */
public void toBOH(int num,int base){
  StringBuilder sb = new StringBuilder();
  int temp = num , temp2;
  int offset = (int)(log10(base)/log10(2));//计算出基于base进制的偏移量
  if((base!=0)){
   while(temp != 0){
    temp2 = temp&(base-1);
    sb.append(arr[temp2]);
    temp = temp>>>offset;
   }
  }else{
   System.out.println("输入错误,请确认后输入!");
  }
  System.out.print(sb.reverse().toString());
}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2