如何二进制字符串转换为10进制在Java中

问题描述:

我有一个代表二进制数(无前导零)字符串数组,我想转化为相应的基地10个号码。考虑:如何二进制字符串转换为10进制在Java中

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

什么是最好的处理方式?我一直在探索java.lang.number。*而没有找到直接的转换方法。 Integer.parseInt(b)产生一个整数等于字符串...如,1001变为1001,而不是9 ...和似乎不包括用于输出基底的参数。 toBinaryString转换方向错误。我怀疑我需要做一个多转换,但似乎无法找到的方法或子类的正确组合。我也不确定前导零或缺少的问题的程度。任何人有任何好的方向指向我?

+4

看[整数#parseInt函数( String s,int radix)](http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Integer.html#parseInt%28java.lang.String,%20int%29) – anubhava 2012-04-16 17:49:49

+0

[将二进制数字转换为十进制数字](http://*.com/qu estions/2115346 /转换 - 二进制数字在十进制数字) – 2012-04-16 17:50:11

你需要specify the radix。还有的Integer#parseInt()过载,它允许你。

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

完美。我完全错过了允许基数的parseInt文档的第二行。像梦一样工作。 – dwwilson66 2012-04-16 17:58:35

+1

这是否也适用于前导零?只是确认,虽然我看不出为什么没有。 – Siddhartha 2017-05-25 15:22:51

这可能会实现:

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

-1不必要的重新发明车轮。 – 2012-04-16 17:57:15

+0

我想这是没有必要的。当你在两节课之间有一点点时间时会发生这种情况。 – Hassan 2012-04-16 17:58:14

+5

这个对我有帮助,因为我必须做一个转换的学校项目,而不使用java已经有的 – bucksnort2 2013-10-16 13:46:13

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

我想我更无聊!修改哈桑的答案正确运作。

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 

我希望帮助

作品就好了!

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

我爱循环!好极了!

​​

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个循环增值经销商,通过Convert boolean to int in 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; 

Java的的Integer.parseInt(文本)的修正版与负数的工作:

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

如果你担心性能,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