【问题标题】:Java program that converts binary numbers to decimal numbers. The input is a string of zeros and ones将二进制数转换为十进制数的 Java 程序。输入是一串零和一
【发布时间】:2023-04-04 15:34:01
【问题描述】:

我必须创建一个使用以下步骤将二进制转换为十进制的 java 程序。作为新手,我做了一些事情,但我不知道我做错了什么或如何继续。

public class BinaryToDecimal {
public static void main(String args[]){
    long sum = 0;
        int result;
        String s = "1001010101011010111001011101010101010101";
        for(int i = s.length()-1; i <= 0; i--){
            result = (int)Math.pow(2, i);
            if(s.charAt(i) == '1')
                sum=sum + result;
        }
        System.out.println(sum);
    }
    }

使用循环读取(charAt())输入字符串中的每个数字(0/1 char),从右到左扫描;

使用循环构建所需的 2 的幂;

使用条件语句分别处理0和1;

使用简单的输入进行调试,例如1、10、101,并在循环中打印中间值。

使用您的程序找出以下二进制数的十进制值:

1001010101011010111001011101010101010101

【问题讨论】:

    标签: java binary decimal converter


    【解决方案1】:

    仅当您的十进制值最多为 2147483647 或 int 在 Java 中的最大值时才执行此操作。如果您不知道,只需检查字符串的长度。如果它小于或等于 32 即 4 个字节,那么您可以使用 parseInt.:

    int decimalValue = Integer.parseInt(s, 2);
    

    有关 Integer.parseInt() 的更多信息,请参阅 HERE

    但如果更多,您可以使用您的代码。我修改了你的循环,这是你的问题所在:

     String s = "1001010101011010111001011101010101010101";
     long result = 0;
     for(int i = 0; i < s.length(); i++){
        result = (long) (result + (s.charAt(i)-'0' )* Math.pow(2, s.length()-i-1));
      }
        System.out.println(result);
    

    【讨论】:

      【解决方案2】:

      我注意到的第一件事是您的二进制数超过 32 位。这不能在 int 的空间中表示,并且会导致溢出。

      作为一个更简单的答案,我运行了以下命令,最后得到了正确的值,它只使用了简单的位移。

      对于字符串中的每个索引,如果字符为1,则在结果中设置相应的位。

      public class BinaryToDecimal {
          public static void main(String[] args) {
              long sum;
              String bin = "1001010101011010111001011101010101010101";
              sum = 0;
              for (int i = 0; i < bin.length(); i++) {
                  char a = bin.charAt(i);
                  if (a == '1') {
                     sum |= 0x01;
                  }
                  sum <<= 1;
              }
              sum >>= 1;
              System.out.println(sum);
          }
       }
      

      【讨论】:

        【解决方案3】:

        循环从 i = s.length()-1 运行直到 i =0。
        下一个问题是“int result”。它可以很好地处理结果为 long ;) (原因:您在 MostSignificantBit 计算 40 位值,但整数仅使用 32 位)
        另外:从最右边的位开始,i=s.length()-1。但是你计算的功率是 2^(s.length()-1) 虽然它应该是 2^0=1。
        解决方法是:result = (long)Math.pow(2, s.length()-1-i)

        编辑: 我真的很喜欢 user2316981 的解决方案,因为它结构清晰(没有 Math.pow,应该改用 shift 更快)。并像我使用 Double&Add 算法一样从 0 循环到 MSB。暂时还不能评论,谢谢提醒 ;)

        【讨论】:

          【解决方案4】:
          import java.util.*;
          import java.lang.Math;
          
          class deci {
          
              int convert(int n) {
                  int tem=1,power=0;
                  int decimal=0;
                  for (int j=0;j<n;j++) {
                      if(n==0) {
                          break;
                      } else {
                          while(n>0) {
                              tem=n%10;
                              decimal+=(tem*(Math.pow(2,power)));
                              n=n/10;
                              power++;
                          }
                      }    
                  } 
                  return decimal;
              }
          
              public static void main(String args[]) {
                  System.out.print("enter the binary no");
                  Scanner sc=new Scanner(System.in);
                  int n=sc.nextInt();
                  deci dc=new deci();
                  int i=dc.convert(n);
                  System.out.print(i);
              }
          
          }
          

          【讨论】:

          • 请解释/描述一下您的代码的作用,以便对读者更有帮助。
          猜你喜欢
          • 2019-01-08
          • 1970-01-01
          • 2022-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-24
          • 1970-01-01
          • 2011-01-08
          • 2014-03-13
          相关资源
          最近更新 更多