如何将二进制string转换为Java中的基数为10的整数

我有一个string数组表示二进制数(没有前导零),我想转换为其对应的基数10数字。 考虑:

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

最好的方法是什么? 我一直在探索java.lang.number。*而没有find一个直接的转换方法。 Integer.parseInt(b)产生一个整数等于string…例如,1001变成1,001而不是9 …,并且似乎不包括输出基数的参数。 toBinaryString做转换错误的方向。 我怀疑我需要做一个多步骤转换,但似乎无法find方法或子类的正确组合。 我也不确定前导零或缺less这个问题的程度。 任何人有什么好的方向指向我?

你需要指定基数 。 Integer#parseInt()允许你重载。

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

这可能工作:

 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; } 
 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; } 
 int foo = Integer.parseInt("1001", 2); 

工作得很好,如果你正在处理正数,但如果你需要处理签名的数字,你可能需要签名扩展你的string,然后转换为一个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 

我希望有帮助!

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

我想我更无聊了! 修改哈桑的答案正常工作。

修正了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)); 

哪里

 public static int binaryStringToDecimal(String biString){ int n = biString.length(); int decimal = 0; for (int d = 0; d < n; d++){ // append a bit=0 (ie 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; // eg dec = 110 | (00)1 = 111 } } return decimal; } 

输出:

  Input Number: 87 toBinary 1010111 Output Number: 87 toBinary 1010111 

我爱循环! 好极了!

 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个循环variables,灵感来源于Java中的转换布尔值为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;