二进制转换器Java

时间:2018-10-02 21:42:51

标签: java while-loop binary

我正在尝试制作一个将十进制转换为二进制的转换器,有一个局限性,我不能使用任何其他循环或语句,除了

while (){}

我无法弄清楚如何开始减去适合小数的数字,并且不能使用任何if语句。有人有建议吗?

import java.util.Scanner;
public class Converter{

static Scanner input = new Scanner (System.in);

public static void main (String[] args){

  System.out.println ("What is the number in the decimal system that you want to convert to binary?");
  int dec = input.nextInt();
  int sqr = 1024;
  int rem;

  while (dec != 0){

      rem = dec / sqr;
      sqr = sqr / 2;
      System.out.print(rem);
  }  
 }
}

4 个答案:

答案 0 :(得分:1)

您的代码有问题。将小数转换为二进制更容易。例如:

int num = 5;
StringBuilder bin = new StringBuilder();
while (num > 0) {
    bin.append(num % 2);
    num /= 2;
}
System.out.println(bin.reverse());

我使用StringBuilder反转我的String,我更喜欢String,因为二进制的长度可以是任意长度。如果使用int或long,则可能会发生溢出。

更新

如果只想使用基本类型,则可以执行以下操作,但可能会发生溢出:

    long reversedBin = 0, Bin = 0;
    while (n > 0) {
        reversedBin = reversedBin * 10 + (n % 2);
        n /= 2;
    }
    while (reversedBin > 0) {
        Bin = Bin * 10 + (reversedBin % 10);
        reversedBin /= 10;
    }
    System.out.println(Bin);

答案 1 :(得分:1)

尝试一下:

import java.util.Scanner;

public class Converter {

    public static void main(String[] args) {

        final Scanner input = new Scanner(System.in);

        System.out.println("What is the number in the decimal system that you want to convert to binary?");
        int dec = input.nextInt();
        int div = 128;

        while (div > 0) {

            System.out.print(dec / div);
            dec = dec % div;
            div >>= 1; // equivalent to div /= 2
        }
        System.out.println();
    }
}

现在,让我们遍历代码并尝试了解正在发生的事情。我假设最大大小为8位,因此变量div设置为2 n-1 ,其中n =1。如果需要16位,则div应该是32768。

程序从该值开始,并尝试通过除法器对给定数字进行整数除法。而且,它的好处是,如果数字大于或等于除数,它将产生1,否则产生0。

因此,如果我们要转换的数字为42,然后将其除以128将得到0,因此我们知道二进制数的第一位为0。

此后,我们将数字设置为整数除法的余数,然后将除法器除以二。我这样做的时候是右移(div >>= 1),但是您也可以使用分配器分配(div /= 2)。

现在,除法器为64,数字仍为42。如果再次执行该操作,我们将再次获得0。

在第三次迭代中,我们将42除以32,得到的结果为1。因此,到目前为止,我们的二进制数字为001。我们将数字设置为除法的余数,即10。

继续此操作,我们得到二进制数00101010。当分频器div为零且没有剩余可分的情况时,循环结束。

尝试逐步了解程序的工作方式。这很简单,但是要想出一个简单的解决方案可能非常困难。在这种情况下,它将应用数学,并了解整数数学在Java中的工作原理。附带经验,您将在适当的时候得到经验。

答案 2 :(得分:0)

请记住从十进制转换为二进制的算法。 令n为以十进制表示的数字:

digit_list = new empty stack
while n>0 do
    digit = n%2
    push digit in stack
    n = n/2
end while
binary = new empty string
while digit_list is not empty do
     character = pop from stack
     append character to binary
end while

Java提供了一个通用类Stack,您可以将其用作数据结构。您也可以使用列表,但请记住以与计算它们相反的顺序来获取数字。

答案 3 :(得分:0)

找到该数字的以2为底的对数,并将其下限以找到所需的位数。然后将整数除以该位的2的幂,然后从原始数中减去该整数并重复直到0。对于负数无效。有更好的解决方案,但这是我的

 int bits = (int) Math.floor(Math.log((double) dec) / Math.log((double) 2));
    System.out.println("BITS:" + bits);
    while (dec > 0) {
        int twoPow = (int) Math.pow((double) 2, (double) bits);
        rem = dec / twoPow;
        dec = dec - rem * twoPow;
        bits--;
        System.out.print(rem);
    }