【问题标题】:Java Decimal To Binary - Big Numbers to BinaryJava 十进制转二进制 - 大数转二进制
【发布时间】:2012-10-26 07:27:25
【问题描述】:

我的程序应该将十进制数转换为二进制数。对于大数,它给我一个负数而不是二进制数。这是为什么呢?

例如,如果我提供2321,我会得到100100010001,这很好。但如果我提供 241242141我得到-2127232070093227171

我不能使用字符串、数组、函数。还有另一个选项没有将其定义为字符串?输出?

import java.util.Scanner;

public class d {

  public static void main(String[] args) {   

    long num = 0;
    long temp = 0L;

    Scanner sc = new Scanner(System.in);
    num = sc.nextLong();

    long place = 1L;
    long output = 0;
    //System.out.print(""+ num%2+ (num%2)%2);
    while(num != 0) {
      temp = num % 2;
      num = num / 2;    

      output += (place*temp);
      place *=10;
    }

    System.out.print(""+output);    
  }
}

【问题讨论】:

  • 我不能使用任何数组。这是我需要使用的代码,没有数组,没有函数等等..这就是我需要使用的。 :)
  • edit your question 更详细地解释 (a) 你希望你的程序做什么,以及 (b) 它目前做错了什么?
  • 我认为output 溢出了,而是使用字符串生成器将结果附加到字符串中然后显示它
  • 使用输出作为字符串,如果你只想显示它,不要太长。
  • System.out.println(Long.toBinaryString(num));做同样的事情

标签: java binary


【解决方案1】:

你的问题来了

  output += (place*temp);
  place *=10;

这会产生一个溢出的数字。

一个简单的替代方法是创建一个字符串,而不是生成一个无论如何都会转换为字符串的数字。

StringBuilder output = new StringBuilder();
while(num != 0) {
  output.append(num & 1);
  num >>>= 1;    
}

System.out.print(output.reverse());   

甚至

StringBuilder output = new StringBuilder();
for(long num = sc.netLong(); num != 0; num >>>= 1) 
  output.append(num & 1);

System.out.print(output.reverse());   

如果您不想使用除输入或输出之外的任何功能。

long num = 241242141;
int shift = 63;
while (num >>> shift == 0 && shift > 0) shift--;
for (; shift >= 0; shift--)
    System.out.print((num >>> shift) & 1);

// for comparison only
System.out.println("\n"+Long.toBinaryString(num));

打印

1110011000010001000000011101
1110011000010001000000011101

【讨论】:

  • 为什么不呢? StringBuilder 是java.lang中的一个基础类
  • @Aubin nextLong() 和 print() 是使用 String 和 String 使用数组的函数,所以它不可能如上所述。 ;)
【解决方案2】:

问题是,您将Binary Equivalent 存储在long type 中,它不能存储这么长的值。

您应该使用StringBuilder 并在其中附加您的remainder - temp。 然后反向打印:-

    StringBuilder builder = new StringBuilder();
    while(num != 0) {
      temp = num % 2;
      num = num / 2;    

      builder.append(temp);
      output += (place*temp);
      place *=10;
    }

    System.out.println(builder.reverse());

如果您不需要使用任何methods,则只需使用String Concatenation,然后循环以反向打印字符串:-

    String builder = "";
    while(num != 0) {
      temp = num % 2;
      num = num / 2;    

      builder += temp;
      output += (place*temp);
      place *=10;
    }

    for (int i = builder.length() - 1; i >= 0; i--) {
        System.out.print(builder.charAt(i));
    }

但是,请注意,这会在Heap 上创建大量String objects。另外,这里您使用的是charAt 方法,您必须使用它。

【讨论】:

  • 好吧,那么没有函数,我们甚至什么都做不了。要打印我们需要System.out.println() 的东西,这是一个函数。此外,如果没有 Scanner 类中使用的任何函数,OP 将无法读取用户输入。
【解决方案3】:

使用递归:

public class d {
   static void toBinaryString( long number )
   {
      if( number > 1 ) toBinaryString( number / 2L );
      System.out.print( number % 2L );
   }
   public static void main(String[] args) {
      long num = 241242141L;
      System.out.println( Long.toBinaryString( num ));
      toBinaryString( num );
   }
}

输出:

1110011000010001000000011101
1110011000010001000000011101

【讨论】:

  • +1 不错的解决方案,也更清晰 :) 但请注意,您仍在使用 functions。 ;) :P
  • 我的意思是:-System.out.print() :D
猜你喜欢
  • 2014-10-30
  • 2012-11-09
  • 1970-01-01
  • 2014-01-07
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
  • 1970-01-01
相关资源
最近更新 更多