Краткое объяснение моего двоичного конвертера

1

Я все еще новичок в java У меня есть код, но я все еще запутался, как это работает

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

heres мой код:

import java.io.*;

public class arrays {
    public static void main(String[] args) throws IOException {
        BufferedReader input = new BufferedReader(new InputStreamReader(
                System.in));
        // Binary Storage
        String[] hex = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A",
                "B", "C", "D", "E", "F" };
        String[] binary = { "0000", "0001", "0010", "0011", "0100", "0101",
                "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101",
                "1110", "1111" };
        // For User!, input a value:
        System.out.print("Input your Hex Number here : ");
        String userInput = input.readLine();
        String result = "";

        for (int i = 0; i < userInput.length(); i++) {
            /* used for separating the value */
            char temp = userInput.charAt(i);
            String temp2 = "" + temp + "";
            for (int j = 0; j < hex.length; j++) {
                if (temp2.equalsIgnoreCase(hex[j])) {
                    result = result + "\n" + temp + "- " + binary[j];
                }
            }
        }

        //Main output
        System.out.println("THE BINARY OF " + userInput + ":" + result);


    }
}
  • 0
    Этот код работает?
  • 0
    @nikpon Да, но это плохой дизайн. Хранить данные в нескольких массивах и полагаться на одинаковый индекс для преобразования между ними - плохая идея.
Показать ещё 9 комментариев
Теги:
converter
binary

1 ответ

0

Ваш код работает, но он неэффективен. Там также есть место для упрощения.

Прежде всего, что вы можете сделать, чтобы сделать вашу программу более эффективной, постройте HashMap<Character, String> шестнадцатеричных символов для двоичных строк:

HashMap<Character, String> map = new HashMap<Character, String>();
map.put("0", "0000");
map.put("1", "0001");
// ...
map.put("F", "1111");

Теперь вам не нужен внутренний цикл for и сравнение значений будет намного быстрее, так как поиск карты по ключу является технически постоянным временем.

Кроме того, вместо использования символа + для конкатенации строк используйте StringBuilder чтобы построить результат и немного ускорить работу ( читайте, почему здесь).

Также для удобства чтения вам, вероятно, следует использовать более значимые имена переменных вместо temp и temp2.

Здесь, как может выглядеть ваш код ( полная ссылка на образец):

    // ...
    StringBuilder result = new StringBuilder();

    for (int i = 0; i < userInput.length(); i++) {
            /* used for separating the value */
            char hexVal = userInput.charAt(i);
            String binary = map.get(hexVal);
            result.append(binary);
    }

    //Main output
    System.out.println("THE BINARY OF " + userInput + ":" + result.toString());

В общем, эти типы преобразований работают, сначала конвертируя в десятичное значение, а затем корректируя значение, поэтому:

binary -> decimal -> hex
hex -> decimal -> binary

Java уже есть методы, которые могут помочь вам в этом.

Так вы можете преобразовать из String содержащей шестнадцатеричное число, в String содержащую двоичное значение этого числа:

String hex = "f";                                // 15 in hex
int decimal = Integer.parseInt(hex, 16);         // this gives 15 in decimal (converts from base 16 to base 10)
String binary = Integer.toBinaryString(decimal); // this gives "1111"
System.out.println(binary);                      // this prints "1111"

Вот как вы можете преобразовать из String содержащей двоичное число, в String содержащую шестнадцатеричное значение этого числа:

String binary = "1111";                    // 15 in decimal
int decimal = Integer.parseInt(binary, 2); // this gives 15 in decimal (converts from base 2 to base 10)
String hex = Integer.toHexString(decimal); // this gives "f"
System.out.println(hex);                   // this prints "f"

Теперь для вашей программы вы можете просто использовать эти методы, вам не нужны String[] hex и String[] binary массивы или цикл for:

public static void main(String[] args) throws IOException {
    BufferedReader input = new BufferedReader(new InputStreamReader(
            System.in));

    // For User!, input a value:
    System.out.print("Input your Hex Number here : ");
    String userInput = input.readLine();

    // conversion from hex to binary in one line, ain't that awesome :)
    String result = Integer.toBinaryString(Integer.parseInt(userInput, 16));

    //Main output
    System.out.println("THE BINARY OF " + userInput + ":" + result);

}

Теперь, конечно, вы позаботились о недопустимом вводе с помощью либо исключений Integer.parseInt Integer.toBinaryString Integer.parseInt и Integer.toBinaryString или Integer.toBinaryString вашу собственную функцию, которая будет проверять, является ли ввод действительным шестнадцатеричным числом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню