2014-09-24 3 views
1

Я еще новичок в Java У меня есть код, но я до сих пор путают, как это работаетКраткое описание моего Binary конвертер

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

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

Работает ли этот код? – 2014-09-24 21:04:22

+0

@nikpon Да, но это плохой дизайн. Хранение данных в нескольких массивах и использование индекса для преобразования между ними - это плохая идея. – azurefrog

+0

Если комментарий ', используемый для разделения значения, сказал' проверять каждый символ в свою очередь', это вам поможет? –

ответ

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 построить свой результат и скорость вещи немного (read why here).

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

Вот как ваш код может выглядеть (full running sample link):

// ... 
    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 или сделать вам собственную функцию, которая будет проверять, если вход является действительным шестнадцатиричным числом ,

Смежные вопросы