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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 周兴中 于 2012-6-24 21:18 编辑

Integer.toBinaryString(-5) 的结果为:11111111111111111111111111111011
反过来怎么会行不通呢?
Integer.parseInt("11111111111111111111111111111011",2)  //  已经表明前面这段String为2进制,Integer 在32位系统中 是由32位二进制组成,没有超出范围啊.
这个二进制转成十进制为什么会报NumberFormatException 数字格式异常?

就是说我转换负的二进制还得自己取反加1,然后再转换了.为什么会没有直接转的方法?



4 个回复

倒序浏览
本帖最后由 耿鑫 于 2012-6-24 20:25 编辑

哥们 !你这有点搞笑了,首先Integer.parseInt(String s, int radix)方法的参数是你要转换的数字的二进制字符串形式,“11111111111111111111111111111011”超出了int的范围,所以肯定会报错啊,你算算11111111111111111111111111111011换成十进制是个多大的数,超出范围了。
回复 使用道具 举报
parseInt(String s, int radix)方法
如果发生以下任意一种情况,则抛出一个 NumberFormatException 类型的异常:

1.第一个参数为 null 或一个长度为零的字符串。
2.基数小于 Character.MIN_RADIX 或者大于 Character.MAX_RADIX。
3.假如字符串的长度超过1,那么除了第一个字符可以是减号 '-' ('u002D’) 外,字符串中存在任意不是由指定基数的数字表示的字符。
4.字符串表示的值不是 int 类型的值。

你的问题就是第二点,
11111111111111111111111111111011转换成十进制就是4294967291,远远超出了int的范围,所以报出了异常,如果你想获得-5,你应该将1111 1111 1111 1111 1111 1111 1111 1011取反,得到
0000 0000 0000 0000 0000 0000 0000 0100,再加1得到
0000 0000 0000 0000 0000 0000 0000 0101,因为源码的第一位是1,表示负数,所以这个就是-5了.
回复 使用道具 举报
public class Test {

    public static void main(String[] args)
    {  
            System.out.println("" + Integer.toBinaryString(-5));
            System.out.println("" + Long.parseLong("11111111111111111111111111111011", 2));
            System.out.println("" + Integer.parseInt("0101", 2));
    }

}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马