在Java中将十进制转换为二进制

9

我正在尝试编写一个将数字转换为二进制的代码,以下是我的代码。在Eclipse中出现了几个错误,我不太理解。 请问这段代码有什么问题?还有其他建议吗?我希望能够学习并听取任何修复它的建议。谢谢。

public class NumberConverte {
  public static void main(String[] args) {
    int i = Integer.parseInt(args);
    public static void Binary(int int1){
      System.out.println(int1 + "in binary is");
      do {
        System.out.println(i mod 2);
      } while (int1>0);
    }
  }
}

错误消息:
  1. 类型 Integer 中的方法 parseInt(String) 对于参数 (String[]) 不适用
  2. 此行有多个标记
    • 在 "(" 上的语法错误,需要分号
    • 在 ")" 上的语法错误,需要分号
    • void 是变量 Binary 的无效类型
  3. 此行有多个标记
    • 在 "mod" 上的语法错误,赋值运算符无效
    • 在 "mod" 上的语法错误,赋值运算符无效

2
你能写出你的输入内容和错误信息吗?这样做有助于加快问题解决速度。 - TimCodes.NET
感谢您的评论。当然, 1.类型Integer中的方法parseInt(String)不适用于参数(String[])。 2.此行有多个标记 -在“(”上的语法错误;需要分号 -在“)”上的语法错误;需要分号 -void对于变量Binary是无效的类型 3.此行有多个标记 -Syntax错误,指定为"mod"的无效赋值运算符 -Syntax错误,指定为"mod"的无效赋值运算符。 - Unknown user
下次直接将错误信息添加到问题中(那里有编辑链接)。我现在已经为您完成了这个操作。 - Paŭlo Ebermann
这里没有小数。输入已经是二进制的了。 - user207421
8个回答

17

Integer.toBinaryString(int)可以完成这个任务!

顺便提一下,如果你正在使用Eclipse,记得纠正语法错误,因为Eclipse可能会提示很多错误。

有效的代码:

public class NumberConverter {
   public static void main(String[] args) {
       int i = Integer.parseInt(args[0]);
       toBinary(i);
   }

   public static void toBinary(int int1){
       System.out.println(int1 + " in binary is");
       System.out.println(Integer.toBinaryString(int1));
   }
}

2
虽然这对学习Java编程没有太大帮助! - TimCodes.NET
另一个问题。我如何从用户那里获取输入?我可能应该在主函数中添加一些内容,对吗? - Unknown user

7

也许您不想使用toBinaryString()。您说您目前正在学习,因此可以像这样自己完成:

/*
  F:\>java A 123
  123
    1  1  0  1  1  1  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0
*/

public class A {
    public static void main(String[] args) {

        int a = Integer.parseInt(args[0]);
        System.out.println(a);

        int bit=1;
        for(int i=0; i<32; i++) {
            System.out.print("  "+(((a&bit)==0)?0:1));
            bit*=2;
        }
    }
}

1

首先,您在方法内部声明了一个方法。主方法是在运行类时首先运行的方法。ParseInt接受一个字符串,而args是一个字符串Array,因此我们需要取数组的第一个(基于0的)索引。

mod不是有效的运算符,您想要的语法是%

您可以使用System.out.print在同一行上打印,而不是println

尝试这些更正并让我知道您的进展:

 public class NumberConverter {
  public static void main(String[] args) {
  int i = Integer.parseInt(args[0]);
  Binary(i);
 } 

 public static void Binary(int int1){
    System.out.println(int1 + " in binary is ");
    do {
        System.out.print(int1 % 2);
        int1 /= 2;
    } while (int1 > 0);


 }
}

感谢chimoo的评论!
  1. 为什么我要在parseInt函数中加上[0]?
  2. 我可以用“mod”代替&吗?
  3. 现在,在没有语法错误的情况下,它仍然显示Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at NumberConverte.main(NumberConverte.java:4)。我该如何启动我的代码?我如何输入一个字符串?
- Unknown user
  1. [0] 是数组(字符串集合)的索引,0 表示第一个。
  2. 不能使用 mod 运算符。
  3. 通过输入 java NumberConverter 32 来输入一个字符串。
- TimCodes.NET
我应该在哪里写这个?我想要从用户那里获取输入,这个可以用来实现吗? - Unknown user
在控制台中输出“yes”,但抱歉我忘了你使用的是Eclipse,我对Eclipse不太熟悉,请谅解。你可能需要注意一下二进制方法的代码是错误的,可以查看其他答案。 - TimCodes.NET

1

你需要解决两个主要问题:

  • 不要在另一个方法中声明一个方法。
  • 你的循环永远不会结束。

对于第一个问题,人们已经指出了如何编写该方法。请注意,在Java中,通常使用小写字母拼写普通方法名称。

对于第二个问题,你从未改变过int1的值,因此你最终会在一个紧密的循环中打印输入的LSB。尝试类似这样的东西:

do {
  System.out.println(int1 & 1);
  int1 = int1 >> 1;
} while (int1 > 0);

解释:

  • int1 & 1:这是一个二进制与运算。它“选择”最小的位(LSB),即对于奇数,(a&1)为1,对于偶数,为0。
  • int1 >> 1:这是一个右移操作。它将所有位向下移动一个位置(>> 3会将其向下移动3个位置)。 LSB(位0)被丢弃,位1成为LSB,位2成为位1,依此类推...(a>>0)什么也不做,保持不变。

然后你会注意到你打印的数字顺序是“错误”的 - 将它们从MSB到LSB打印更自然。你正在反向输出。要修复这个问题,你可能最好使用一个for循环,从MSB到LSB检查每个位。

for循环的想法是查看int中的每个32位,从MSB开始,以便从左到右打印它们。像这样:

for (i=31; i>=0; i--) {
  if (int1 & (1<<i)) {
    // i-th bit is set
    System.out.print("1");
  } else {
    // i-th bit is clear
    System.out.print("0");
  }
}

1<<i 是左移操作。类似于右移,但方向相反。(我还没有测试过这个。)

一旦你成功实现了这个,我建议你尝试做同样的事情,但不要打印出前导零。


感谢Mat。 在这种情况下我该如何使用“for”循环? “int1 = int1 >> 1;”是什么意思? - Unknown user

1

我建议您先在IDE中编译程序。如果您没有使用IDE,我建议您获取一个免费的IDE。这将显示您的错误位置,我建议您在着手改进之前先纠正错误并使其编译通过。


抱歉,我是指“修复”,而不是“改进”。 - Unknown user

0
这是我为Android编写的一个小位测试代码。
int myres = bitTest(7, 128);
public int bitTest(int bit,int value)
 {
    int res = 0;
    int i = 0;
    while (i <= bit) {
        res = (value & 1);
        value = value >> 1;
        i++;
    }
    return res;
 }

最好的祝愿 米卡埃尔·安德森


这个到底应该做什么? - user207421

0
StringBuffer sb = new StringBuffer("");
void breakNumber(int num){
    if(num == 0 || num == 1){
        System.out.println(num);
    }else{
        int modr = num % 2;
        sb.append(modr);
        int divr = num / 2;
        if(divr > 1){
              breakNumber(divr);    
        }else{
             sb.append(modr);
             StringBuffer sbr =sb.reverse();
             System.out.println(sbr.toString());    
        }
    }
 }

-1
package gg;

import java.util.*;

public class Gg {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        boolean flag = true;
        while (flag) {
            menu();
            int n = in.nextInt();
            switch (n) {
            case 1:
                System.out.println("enter an integer decimal number : ");
                int d = in.nextInt();
                System.out.print("the answer is ");
                DTB(d);
                System.out.println();
                break;
            case 2:
                System.out.println("enter a binary number : ");
                int b = in.nextInt();
                System.out.print("the answer is " + BTD(b));
                System.out.println();
                break;
            case 3:
                flag = false;
                break;
            }
        }
    }

    public static void menu() {
        System.out.println("1.convert decimal to binary : ");
        System.out.println("2.convert binary to decimal : ");
        System.out.println("3.exit");
    }

    public static void DTB(int x) {
        int n = 0;
        int y = x;
        while (y > 0) {
            y /= 2;
            n++;
        }
        int s[] = new int[n];
        int i = 0;
        while (x > 0) {
            s[i] = x % 2;
            x /= 2;
            i++;
        }
        for (int j = s.length - 1; j >= 0; j--) {
            System.out.print(s[j]);
        }
    }

    public static int BTD(int x) {
        int y = 2;
        int sum = 0;
        double k = 1;
        int c = 0;
        while (x > 0) {
            double z = x % 10;
            x /= 10;
            k = Math.pow(y, c);
            c++;
            k *= z;
            sum += k;
        }
        return sum;
    }

}

1
请花些时间为您的答案添加描述,不要只发布代码答案。 - Dan-Dev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接