如何在Java中将二进制字符串转换为以10为基数的整数


106

我有一个表示二进制数(不带前导零)的字符串数组,我想将其转换为相应的基数10。考虑:

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

最好的进行方法是什么?我一直在探索java.lang.number。*而没有找到直接转换方法。Integer.parseInt(b)对String产生一个整数EQUAL ...例如,1001变为1,001而不是9 ...并且似乎不包括输出基数的参数。toBinaryString转换方向错误吗?我怀疑我需要进行多步转换,但似乎找不到正确的方法或子类组合。我也不确定前导零或缺少前导零的程度是否会成为问题。有人有什么好的指导指向我吗?



Answers:


261

您需要指定基数。有一个过载Integer#parseInt()允许您。

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

1
完美。我完全错过了parseInt文档中允许使用基数的第二行。像梦一样工作。
dwwilson66 '04

1
这也适用于前导零吗?只是确认一下,尽管我没有理由不这样做。
Siddhartha

@NagabhushanBaddi示例?您是否通过了二进制补码表示形式?
马特·鲍尔

18

这可能起作用:

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;
}

我认为这是不必要的。当您在上课之间有一点时间时,就会发生这种情况。
哈桑2012年

6
这对我很有帮助,因为我必须做一个学校项目并进行转换,而不必使用Java已经拥有的转换
bucksnort2

有人测试过吗?在这里number.length减去索引加1乘以2,如果我没记错,那么从1开始,然后将该值乘以2,然后获取结果,然后将其乘以2,这将是您的3位,依此类推上
Christopher Cabezudo Rodriguez

(注释框不适用于片段)在这里,我在您的代码中使用的代码(我迷路了,并使用您的代码作为模板)public static int binaryToInteger(String binary)int结果= 0; int posValue = 1; for(int i = numbers.Length-1; i> = 0; i--){if(numbers [i] =='1'){结果+ = posValue; } posValue * = 2; 返回结果;}
Christopher Cabezudo Rodriguez 2015年

1
此代码段不起作用。for循环和新result变量的计算不正确。
trylimits

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

如果您要处理正数,则效果很好,但是如果您需要处理带符号的数字,则可能需要对符号进行扩展,然后将其转换为Int

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));
宙斯

5
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;
}

2
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的答案以正确运行。


1

对我来说,尝试处理负数时遇到了NumberFormatException。我将以下用于负数和正数。

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

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

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

从右到左有2个循环var,受Java中将boolean转换为int的启发(绝对可怕):

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

如果您担心性能,Integer.parseInt()并且Math.pow()价格太昂贵。您可以使用位操作以两倍的速度完成相同的操作(根据我的经验):

final int num = 87;
String biStr = Integer.toBinaryString(num);

System.out.println(" Input Number: " + num + " toBinary "+ biStr);
int dec = binaryStringToDecimal(biStr);
System.out.println("Output Number: " + dec + " toBinary "+Integer.toBinaryString(dec));

哪里

int binaryStringToDecimal(String biString){
  int n = biString.length();      
  int decimal = 0;
  for (int d = 0; d < n; d++){
    // append a bit=0 (i.e. shift left) 
    decimal = decimal << 1;

    // if biStr[d] is 1, flip last added bit=0 to 1 
    if (biString.charAt(d) == '1'){
      decimal = decimal | 1; // e.g. dec = 110 | (00)1 = 111
    }
  }
  return decimal;
}

输出:

 Input Number: 87 toBinary 1010111
Output Number: 87 toBinary 1010111
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.