Двоичный конвертер Java - PullRequest
       10

Двоичный конвертер Java

0 голосов
/ 03 октября 2018

Я пытаюсь сделать конвертер, который преобразует десятичные числа в двоичные, есть ловушка, но я не могу использовать другие циклы или операторы, кроме

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 голосов
/ 03 октября 2018

найдите в базе 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);
    }
0 голосов
/ 03 октября 2018

Запомните алгоритм преобразования десятичных чисел в двоичные.Пусть 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, который можно использовать в качестве структуры данных.Вы также можете использовать списки, но не забывайте брать цифры в обратном порядке, который вы их вычислили.

0 голосов
/ 03 октября 2018

Попробуйте это:

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.Это приходит с опытом, который вы получите в свое время.

0 голосов
/ 03 октября 2018

Ваш код имеет некоторые проблемы.Проще преобразовать десятичную в двоичную.Пример:

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

Я использую StringBuilder, чтобы перевернуть мою строку, и я предпочитаю строку, потому что длина двоичного файла может быть любой.если вы используете 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);
...