日期:2014-05-20  浏览次数:20587 次

求助个进制转换的问题
要求是将一个数字做任意进制的转换。
10进制以下的每一位数字使用0~9表示。超过10的每一位数字,使用大写字母A~Z表示。

没头绪啊~

------解决方案--------------------
http://cavonchen.blog.163.com/blog/static/11301439620102210159330/
------解决方案--------------------
我由small-C改写的代码
Java code

public class itoa_test {

    /**
     * @param args
     */

    public static String itoa(int input,int base)
    {
        String output="";
        int c=0;
        int lowbit=0;
        
         base >>= 1;
          do {
            lowbit = input & 1;
            input = (input >> 1) & 0xffffffff;
            c = ((input % base) << 1) + lowbit;
            if(c < 10) 
                c += '0'; 
             else c +='A';
            output+=(char)c;
            } while((input/=base)!=0);
          
          StringBuffer sb=new StringBuffer(output);

          output= sb.reverse().toString();
        
        return output;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println(itoa(100,16));
    }

}

------解决方案--------------------
Java code


public class TestConvertion {

    public static void main(String[] args) {

    System.out.println("\n---正数------");
    for (int i = 2; i <= 36; i++) {// 测试100的 2进制 3进制 .....36进制
        System.out.printf(" %2d进制:%7s", i,convert(100, i));
        if (i % 6 == 1)
        System.out.println();
    }
    System.out.println("\n---负数------");
    for (int i = 2; i <= 36; i++) {// 测试-100的 2进制 3进制 .....36进制
        System.out.printf(" %2d进制:%7s", i,convert(-100, i));
        if (i % 6 == 1)
        System.out.println();
    }

    }
    
    /**
     * @param decimal:要转换的数
     * @param base:找转换的进制
     * @return:转换成功后的数据
     */
    static String convert(int decimal, int base) {
    if (base < 2 || base > 36)
        throw new UnsupportedOperationException("输入错误");
    // 十进制的数 允许转化成2进制 3进制 .....36进制,
    // 并且以字符串形式返回
    char[] a = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
    int dividend = decimal < 0 ? -decimal : decimal;// 被除数,有可能是负数
    int divider = base; // 除数
    int quotient = 0;// 商
    int remainder = 0;
    String result = "";
    while ((quotient = dividend / divider) != 0) {
        remainder = dividend % divider;
        // System.out.println(dividend + " " + divider + " " + quotient + "
        // " + remainder);
        result = a[remainder] + result;
        dividend = quotient;// 重新初始化,更新被除数
    }
    remainder = dividend % divider;
    result = a[remainder] + result;

    if (decimal < 0)
        return '-' + result;// 如果是负数
    return result;
    }
}
/*

---正数------
  2进制:1100100  3进制:  10201  4进制:   1210  5进制:    400  6进制:    244  7进制:    202
  8进制:    144  9进制:    121 10进制:    100 11进制:     91 12进制:     84 13进制:     79
 14进制:     72 15进制:     6A 16进制:     64 17进制:     5F 18进制:     5A 19进制:     55
 20进制:     50 21进制:     4G 22进制:     4C 23进制:     48 24进制:     44 25进制:     40
 26进制:     3M 27进制:     3J 28进制:     3G 29进制:     3D 30进制:     3A 31进制:     37
 32进制:     34 33进制:     31 34进制:     2W 35进制:     2U 36进制:     2S
---负数------
  2进制:-1100100  3进制: -10201  4进制:  -1210  5进制:   -400  6进制:   -244  7进制:   -202
  8进制:   -144  9进制:   -121 10进制:   -100 11进制:    -91 12进制:    -84 13进制:    -79
 14进制:    -72 15进制:    -6A 16进制:    -64 17进制:    -5F 18进制:    -5A 19进制:    -55
 20进制:    -50 21进制:    -4G 22进制:    -4C 23进制:    -48 24进制:    -44 25进制:    -40
 26进制:    -3M 27进制:    -3J 28进制:    -3G 29进制:    -3D 30进制:    -3A 31进制:    -37
 32进制:    -34 33进制:    -31 34进制:    -2W 35进制:    -2U 36进制:    -2S
 */