首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >二进制转换码

二进制转换码
EN

Code Review用户
提问于 2015-11-07 18:21:12
回答 3查看 1.3K关注 0票数 12

我编写了一个程序来转换用户给出的十进制数,并将其转换为二进制数。例如,如果我输入2,它将返回10。然后,它计算二进制转换中的1和0的数量。请告诉我任何方式我的代码可以是更有效的,或如果我的代码有错误。如果有什么不好的做法,请告诉我。压痕对我也很重要。

代码语言:javascript
复制
package Conversions;
import java.util.Scanner;

public class BinaryChallenge {
    @SuppressWarnings("resource")
    public static void main(String[] args) {
    int number; 

    Scanner scan = new Scanner(System.in);
    int oneCount = 0;
    int zeroCount = 0;
    System.out.println("Enter a positive integer");
    number = scan.nextInt();
    String binary = "";
    if (number < 0) {
        System.out.println("Error: Not a positive integer");
    } else { 
        while(number > 0) {
            int mod = (number % 2);
            number /= 2;
            binary = Integer.toString(mod) + binary;
        }
        System.out.println("The binary representation of your integer is: " + binary + ".");
    }

    for (int i = 0; i < binary.length(); i++) {
        if (binary.charAt(i) == '1') {
            oneCount++;
        } else if(binary.charAt(i) == '0') {
            zeroCount++;
        }
    }
    System.out.println("The binary representation of your integer has: " + oneCount + " ones.");
    System.out.println("The binary representation of your integer has: " + zeroCount + " zeros.");
    System.out.println("The binary representation of your integer has 0 twos... duh.");
}   
}
EN

回答 3

Code Review用户

回答已采纳

发布于 2015-11-07 18:40:06

输入验证?

乍一看,这看起来像是某种输入验证:

如果(数字< 0) {System.out.println(“错误:不是正整数”);}{ // .}/.System.out.println(“整数的二进制表示形式有:”+ oneCount +“ones.");System.out.println(”整数的二进制表示形式有:“+ zeroCount +”零“);

但这不是..。如果输入为负值,处理程序将很高兴地继续并打印该数字有0零和0 1,这不是真的。

最后,错误应该打印在System.err上而不是System.out上。

可变作用域

在您真正需要它们的地方声明变量,而不是更快。numberzeroCountoneCount都可以稍后声明。

分解为较小的单位

与其将代码转储到单个main方法中,不如对多个小方法进行分解,每个方法负责一件事。例如,您可以使用以下方法:

  • 从标准输入读取int
  • int转换为二进制字符串
  • 计算二进制字符串中的数目
    • 0的个数是长度减去1的数。

简化

而不是这样:

二进制= Integer.toString(mod) +二进制;

您可以简化为:

代码语言:javascript
复制
binary = mod + binary;

重新发明车轮

Integer.toBinaryString(...)执行与主循环相同的操作。

票数 10
EN

Code Review用户

发布于 2015-11-07 20:16:39

算法

其他答案是正确的,您应该使用Integer.toBinaryString(...),但是如果您必须自己实现二进制转换,则最好使用按位运算符。这将允许你支持负数和正数。还可以在将1和0添加到结果字符串时,通过计数它们来节省时间和行数。

Practice

您使用的是@SuppressWarnings("resource")注释,而不是关闭扫描仪。您应该关闭它,或者,如果您使用的是Java 7,则应该使用try-with-resources语句。这将确保你的扫描仪关闭。

您使用3个不同的int变量,这些变量是在代码中的不同点创建的。最好是把它们放在同一个定义中,或者至少彼此接近。您可以从StringBuilder对象中获得更好的性能,而不是连接到相同的字符串。对于这样简单的代码来说,这并不是一个真正的问题,但将来可能会成为一个问题。

票数 9
EN

Code Review用户

发布于 2015-11-07 18:39:54

  • 如果您真的想坚持使用字符串,可以使用Integer.toBinaryString(...):将整数参数的字符串表示形式作为基2中的无符号整数返回。
  • 但是,您也可以使用BitSet及其valueOf(long[] longs)cardinality()length()方法,而不是String binary来获取oneCountzeroCount。它还含蓄地处理负数。
  • 如果您经常使用System.out,您可以使用:导入静态java.lang.System.out;然后只使用: out.printF=ln
  • 而不是println()和字符串连接在我的内部使用printf(...),例如:out.printf(“您的整数的二进制表示有%d的。”,oneCount);
  • 我使用:out.print(“输入正整数:");(用于同一行的输入),但这可能是个人喜好。
  • 限制正数是一个限制。数学上讲,负数也可以用二进制数来表示。
票数 5
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/110127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档