如何在Java中将二进制字符串转换为十进制整数

152

我有一个字符串数组,它们表示二进制数字(没有前导零),我想将它们转换为对应的十进制数字。例如:

binary 1011 becomes integer 11
binary 1001 becomes integer 9
binary   11 becomes integer 3   etc. 

有什么最好的方法吗?我一直在探索 java.lang.number.*,但没有找到直接的转换方法。Integer.parseInt(b) 生成与字符串相等的整数...例如,1001 变成了 1,001 而不是 9... 并且似乎没有包含输出基数的参数。 toBinaryString 将转换方向搞错了。 我怀疑我需要进行多步转换,但似乎找不到正确的方法或子类。 我也不确定前导零或缺少前导零会出现什么问题。 有人能给我好的指导吗?


4
请查看Integer#parseInt(String s, int radix)。该方法可以将一个字符串解析为指定进制的整数。 - anubhava
可能是将二进制数转换为十进制数的重复问题。 - Mike Samuel
12个回答

369

你需要指定进制。在Integer#parseInt()中有一种重载方法可以允许你这么做。

int foo = Integer.parseInt("1001", 2);

1
完美。我完全错过了parseInt文档中允许使用基数的第二行。现在像梦一样运行。 - dwwilson66
1
这个也支持前导零吗?只是确认一下,虽然我看不出有什么问题。 - Siddhartha
@NagabhushanBaddi 你有例子吗?你是否传递了二进制补码表示? - Matt Ball

25

这可能有效:

public int binaryToInteger(String binary) {
    char[] numbers = binary.toCharArray();
    int result = 0;
    for(int i=numbers.length - 1; i>=0; i--)
        if(numbers[i]=='1')
            result += Math.pow(2, (numbers.length-i - 1));
    return result;
}

我想这有点不必要。这就是当你在上课之间有一点时间时会发生的事情。 - user377628
6
这对我很有帮助,因为我必须做一个学校项目,涉及转换但不能使用Java已经有的转换功能。 - bucksnort2
有人在之前测试过这个吗?这里的 number.length 减去索引再加1被乘以2,如果我没记错的话,在二进制中你会从1开始乘以2,然后获取结果并将其乘以2,那就是你的第3位数字,以此类推。 - Christopher Cabezudo Rodriguez
1
这段代码片段没有起作用。 for 循环和新 result 变量的计算不正确。 - trylimits
i==0; 这段代码是不起作用的,为什么会有这么多赞呢? - fubo
显示剩余4条评论

15
int foo = Integer.parseInt("1001", 2);

如果你要处理正数,那么这段代码可以很好地运行,但是如果你需要处理带符号的数字,你可能需要对字符串进行符号扩展,然后将其转换为整数。

public class bit_fun {
    public static void main(String[] args) {
        int x= (int)Long.parseLong("FFFFFFFF", 16);
        System.out.println("x =" +x);       

        System.out.println(signExtend("1"));
        x= (int)Long.parseLong(signExtend("1"), 2);
        System.out.println("x =" +x);

        System.out.println(signExtend("0"));
        x= (int)Long.parseLong(signExtend("0"), 2);
        System.out.println("x =" +x);

        System.out.println(signExtend("1000"));
        x= (int)Long.parseLong(signExtend("1000"), 2);
        System.out.println("x =" +x);

        System.out.println(signExtend("01000"));
        x= (int)Long.parseLong(signExtend("01000"), 2);
        System.out.println("x =" +x);
    }

    private static String signExtend(String str){
        //TODO add bounds checking
        int n=32-str.length();
        char[] sign_ext = new char[n];
        Arrays.fill(sign_ext, str.charAt(0));

        return new String(sign_ext)+str;
    }
}

output:
x =-1
11111111111111111111111111111111
x =-1
00000000000000000000000000000000
x =0
11111111111111111111111111111000
x =-8
00000000000000000000000000001000
x =8 

我希望这有所帮助!


1
我需要将二进制的-1转换为十进制,我这样做了。 System.out.println((int)Long.parseLong("11111111111111111111111111111111",2)); - Zeus

6
static int binaryToInt (String binary){
    char []cA = binary.toCharArray();
    int result = 0;
    for (int i = cA.length-1;i>=0;i--){
        //111 , length = 3, i = 2, 2^(3-3) + 2^(3-2)
        //                    0           1  
        if(cA[i]=='1') result+=Math.pow(2, cA.length-i-1);
    }
    return result;
}

4

使用位移操作比Math.pow更加优雅和快速。只需使用val <<= 1将数字(0或1)移动到正确的位置即可。

// parse an unsigned binary string, valid up to 31 bits
static int binaryToBase10(String binaryString) {
    int val = 0;
    for (char c : binaryString.toCharArray()) {
        val <<= 1;
        val += c-'0';
    }
    return val;
}

使用示例

int val = binaryToBase10("1011");
System.out.println(val);

打印输出11


3
public Integer binaryToInteger(String binary){
    char[] numbers = binary.toCharArray();
    Integer result = 0;
    int count = 0;
    for(int i=numbers.length-1;i>=0;i--){
         if(numbers[i]=='1')result+=(int)Math.pow(2, count);
         count++;
    }
    return result;
}

我猜我更无聊了!修改了Hassan的答案以使其正常运行。

2

当我尝试处理负数时,出现了NumberFormatException异常。我使用以下代码来处理正负数:

对于负数:

int num = Integer.parseInt(strNum);

对于正数:

int num = Integer.valueOf(strNum);

"最初的回答"的意思是原始答案。

System.out.println(Integer.parseUnsignedInt("11111111111111111111111111110111", 2));      

Output : -9

0

修复了 Java 中 Integer.parseInt(text) 方法不能处理负数的版本:

public static int parseInt(String binary) {
    if (binary.length() < Integer.SIZE) return Integer.parseInt(binary, 2);

    int result = 0;
    byte[] bytes = binary.getBytes();

    for (int i = 0; i < bytes.length; i++) {
        if (bytes[i] == 49) {
            result = result | (1 << (bytes.length - 1 - i));
        }
    }

    return result;
}

0

我喜欢循环!耶!

String myString = "1001001"; //73

累加器循环,从左到右(l不改变):

int n = 0,
    j = -1,
    l = myString.length();
while (++j < l) n = (n << 1) + (myString.charAt(j) == '0' ? 0 : 1);
return n;

右向左循环,使用2个循环变量,灵感来自于Java中将布尔值转换为整数(非常糟糕的做法):

int n = 0,
    j = myString.length,
    i = 1;
while (j-- != 0) n -= (i = i << 1) * new Boolean(myString.charAt(j) == '0').compareTo(true);
return n >> 1;

稍微合理一点的实现:

int n = 0,
    j = myString.length(),
    i = 1;
while (j-- != 0) n += (i = i << 1) * (myString.charAt(j) == '0' ? 0 : 1);
return n >> 1;

一个可读的版本 :p

int n = 0;
for (int j = 0; j < myString.length(); j++) {
    n *= 2;
    n += myString.charAt(j) == '0' ? 0 : 1;
}
return n;

0

如果你有一个字符串,也可以使用这种方法将二进制转换为十进制整数。(Java语言)

static int binaryTodecimal(String s){
    int i= -1;
    char[] str = s.toCharArray();
    int dec_val= 0;
    
    for (int j=str.length-1; j>=0 ;j-- ){
        int k= Integer.valueOf(str[j]) - '0';
        i = i+1;
        dec_val += k*(Math.pow(2, i));
        
    }
    System.out.println(dec_val);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接