用java写的进制转换的算法。

时间:2022-03-15 11:10:09

主要的两个算法是:

public static String baseString(int num, int base)
    {
        System.out.println("+++++++"+num);
        if (base > 16)
        {
            throw new RuntimeException("进制数超出范围,base<=16");
        }
        StringBuffer str = new StringBuffer("");
        String digths = "0123456789ABCDEF";
        Stack<Character> s = new Stack<Character>();
        System.out.println(num != 0);
        while (num != 0)
        {
            //charAt返回指定索引处的 char 值
            s.push(digths.charAt(num % base));
           
            /**
             * 近来的num永远是十进制数因为不是十进制也在方法
             * baseNum(String num, int srcBase, int destBase)
             * 转成了十进制了
             * 此算法的精髓在于就像我们把十进制的数转换成如二进制:
             * 十进制数num=16转成二进制就是16%2求余数把16/2的数再保存到num中。循环直到num=0就可以求出
             * 二进制后的数
             */
            num /= base;
        
        }
        while (!s.isEmpty())
        {
            str.append(s.pop());
        }
        return str.toString();
    }

 

 

 

方法二:

public static String baseNum(String num, int srcBase, int destBase)
    {
        if (srcBase == destBase)
        {
            return num;
        }
        String digths = "0123456789ABCDEF";
        char[] chars = num.toCharArray();
        int len = chars.length;
        if (destBase != 10)
        {
            //@@@
            // 目标进制不是十进制 先转化为十进制
            //此目的在于如要把二进制转成十六进制。则先把二进制转成十进制在调用
            //baseString(Integer.valueOf(num), destBase)转成十六进制  递归
            num = baseNum(num, srcBase, 10);
           
            System.out.println(num);
        }
        else
        {
            /**
             * 如果目标进制是十进制则直接把源进制转换成十进制不需要@@@的步骤
             */
            int n = 0;
            for (int i = len - 1; i >= 0; i--)
            {
                //pow()返回第一个参数的第二个参数次幂的值
                n += digths.indexOf(chars[i]) * Math.pow(srcBase, len - i - 1); // (8,0)
                                                                                // (8,1)
            }
            return n + "";
        }
        /**
         * valueOf
         * 返回保持指定的 String 的值的 Integer 对象。
         * 将该参数解释为表示一个有符号的十进制整数,
         * 就好像将该参数赋予 parseInt(java.lang.String) 方法一样。
         * 结果是一个表示字符串指定的整数值的 Integer 对象。
         */
        return baseString(Integer.valueOf(num), destBase);
    }

 

 

 

再在main函数中调用:

 

 public static void main(String[] args)
    {
        String s = baseNum("11111", 2,16); // 128+64+8
        System.out.println(s);
    }

 

 

上述九可以完成两个进制直接的转换了