【问题标题】:How to convert a Binary String to a base 10 integer in Java如何在 Java 中将二进制字符串转换为以 10 为底的整数
【发布时间】:2012-04-28 01:40:06
【问题描述】:

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

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 转换方向错误。我怀疑我需要进行多步转换,但似乎找不到正确的方法或子类组合。我也不确定前导零或缺少前导零会在多大程度上成为问题。有人有什么好的方向可以指点我吗?

【问题讨论】:

标签: java string binary radix


【解决方案1】:

您需要specify the radixInteger#parseInt() 的重载允许您这样做。

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

【讨论】:

  • 完美。我完全错过了允许基数的 parseInt 文档的第二行。像梦一样工作。
  • 这是否也适用于前导零?只是确认一下,虽然我看不出为什么不这样做。
  • @NagabhushanBaddi 例子?您是否传递二进制补码表示?
【解决方案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;
}

【讨论】:

  • 我想这有点不必要。当你在课间有一点时间时,就会发生这种情况。
  • 这个对我很有帮助,因为我必须在不使用 java 已有的转换的情况下做一个学校项目
  • 以前有人测试过吗?这里 number.length 减去索引加 1 被乘以 2,如果我没记错的话,你从 1 开始并将该值乘以 2,然后获取结果并将其乘以 2,这将是你的第 3 位等等上
  • (评论框不适合片段)这是我在你的代码中使用的代码(我迷路了,用你的作为模板) public static int binaryToInteger(String binary) { char[]数字 = binary.ToCharArray();整数结果 = 0; int posValue = 1; for (int i = numbers.Length - 1; i >= 0 ; i--) { if (numbers[i] == '1') { result += posValue; } posValue *= 2; } 返回结果; }
  • 此代码 sn-p 不起作用。 for 循环和新 result 变量的计算不正确。
【解决方案3】:
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 从二进制转换为十进制,我这样做了。 System.out.println((int)Long.parseLong("11111111111111111111111111111111",2));
【解决方案4】:
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;
}

【讨论】:

    【解决方案5】:
    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 的答案以正确运行。

    【讨论】:

      【解决方案6】:

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

      System.out.println(Integer.parseUnsignedInt("11111111111111111111111111110111", 2));      
      
      Output : -9
      

      【讨论】:

        【解决方案7】:

        使用 bitshift 比Math.pow 更优雅、更快捷。只需将数字(0 或 1)移位到 val <<= 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

        【讨论】:

          【解决方案8】:

          修复了 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;
          }
          

          【讨论】:

            【解决方案9】:

            我喜欢循环!耶!

            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 个循环变量,灵感来自 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;
            

            【讨论】:

              【解决方案10】:

              现在你想做从二进制字符串到十进制但后记,你可能需要相反的方法。它在下面。

              public static String decimalToBinaryString(int value) {
                  String str = "";
                  while(value > 0) {
                      if(value % 2 == 1) {
                          str = "1"+str;
                      } else {
                          str = "0"+str;
                      }
                      value /= 2;
                  }
                  return str;
              }
              

              【讨论】:

                【解决方案11】:

                如果给定的是字符串,也可以使用此方法将二进制转换为十进制整数。(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);
                }
                

                【讨论】:

                  【解决方案12】:

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

                  【讨论】:

                    猜你喜欢
                    • 2023-03-29
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-07-26
                    • 1970-01-01
                    • 1970-01-01
                    • 2022-12-07
                    • 2012-02-27
                    相关资源
                    最近更新 更多