A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄丽慧 中级黑马   /  2012-7-2 17:36  /  2652 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黄丽慧 于 2012-7-5 12:14 编辑

刚刚在群里面有个人问怎么把111100输出为十进制的数字,我上网查了一下发现,可以调用Integer.parseInt(string s,int radix)来实现
也就是int i=Integer.parseInt("111100",2);
我想问的问题是:这个parseInt的代码具体是怎么写的,使得二进制,八进制,十六进制的数字都能转换成十进制。

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
  1.         public static int toDec(String str, int radix)
  2.         {
  3.                 char[] chs = {'0','1','2','3',
  4.                                         '4','5','6','7',
  5.                                         '8','9','A','B',
  6.                                         'C','D','E','F'};
  7.                 char[] num = str.toCharArray();
  8.                 int dec = 0;
  9.                
  10.                 for (int len=num.length, i=len-1; i>=0; i--)
  11.                 {
  12.                         if (i==0 && num[0]=='-')
  13.                         {
  14.                                 dec = -dec;
  15.                         }
  16.                         for (int j = 0; j<radix; j++)
  17.                         {
  18.                                 if (chs[j]==num[i])
  19.                                 {
  20.                                         dec += j*Math.pow(radix,len-i-1);
  21.                                 }
  22.                         }
  23.                 }

  24.                 return dec;
  25.         }
复制代码
写了个方法供楼主参考
回复 使用道具 举报
static int digit(int ch, int radix) {

        int value = -1;

        if (radix >= Character.MIN_RADIX && radix <= Character.MAX_RADIX) {

            int val = getProperties(ch);

            int kind = val & 0x1F;

            if (kind == Character.DECIMAL_DIGIT_NUMBER) {

                value = ch + ((val & 0x3E0) >> 5) & 0x1F;

            }

            else if ((val & 0xC00) == 0x00000C00) {

                // Java supradecimal digit

                value = (ch + ((val & 0x3E0) >> 5) & 0x1F) + 10;

            }

        }

        return (value < radix) ? value : -1;

    }

用到最后用的是这段代码

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1 很给力!

查看全部评分

回复 使用道具 举报
下面就是这个函数的源码
public static int parseInt(String s, int radix)
                throws NumberFormatException
    {
        if (s == null) {
            throw new NumberFormatException("null");
        }

        if (radix < Character.MIN_RADIX) {
            throw new NumberFormatException("radix " + radix +
                                            " less than Character.MIN_RADIX");
        }

        if (radix > Character.MAX_RADIX) {
            throw new NumberFormatException("radix " + radix +
                                            " greater than Character.MAX_RADIX");
        }

        int result = 0;
        boolean negative = false;
        int i = 0, max = s.length();
        int limit;
        int multmin;
        int digit;

        if (max > 0) {
            if (s.charAt(0) == '-') {
                negative = true;
                limit = Integer.MIN_VALUE;
                i++;
            } else {
                limit = -Integer.MAX_VALUE;
            }
            multmin = limit / radix;//注意这里的是2
            if (i < max) {
                digit = Character.digit(s.charAt(i++),radix);
                if (digit < 0) {
                    throw NumberFormatException.forInputString(s);
                } else {
                    result = -digit;
                }
            }
            while (i < max) {
                // Accumulating negatively avoids surprises near MAX_VALUE
                digit = Character.digit(s.charAt(i++),radix);
                if (digit < 0) {
                    throw NumberFormatException.forInputString(s);
                }
                if (result < multmin) {
                    throw NumberFormatException.forInputString(s);
                }
                result *= radix;
                if (result < limit + digit) {
                    throw NumberFormatException.forInputString(s);
                }
                result -= digit;
            }
        } else {
            throw NumberFormatException.forInputString(s);
        }
        if (negative) {
            if (i > 1) {
                return result;
            } else {        /* Only got "-" */
                throw NumberFormatException.forInputString(s);
            }
        } else {
            return -result;
        }
    }

点评

可是这个radix应该是指要转换成十进制的数字原来是几进制的,那应该对它进行判断,再进行进制转换计算吧。  发表于 2012-7-2 22:09

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1 很给力!

查看全部评分

回复 使用道具 举报
估计你也得好大一会看 给你个官方关于这个方法的解释吧
Parses the string argument as a signed integer in the radix
     * specified by the second argument. The characters in the string
     * must all be digits of the specified radix (as determined by
     * whether {@link java.lang.Character#digit(char, int)} returns a
     * nonnegative value),

什么意思呢,第一句就是说把你的字符串解析成以第二个参数为基础的整数返回,我的理解就是第二个参数就是进制数,但是注意的是,你的字符串里面的值必须是你第二个参数指定的形式,假如你指定二进制,就必须是101010等二进制形式,,而且你字符串的内容都必须是数字,不然就会返回-1,其实读到这里你就大概知道意思了,不必去挖的这么深,现在还不到这个层次,张老师经常都说,我只管吃鸡蛋不管哪只鸡下的蛋就是这个道理,你只要会用没人问你为什么这么用
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马