Ваш код работает, но это неэффективно. Там также есть место для упрощения.
Прежде всего, что вы можете сделать, чтобы сделать вашу программу более эффективной, это построить 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
или сделать вам собственную функцию, которая будет проверять, если вход является действительным шестнадцатиричным числом ,
Работает ли этот код? – 2014-09-24 21:04:22
@nikpon Да, но это плохой дизайн. Хранение данных в нескольких массивах и использование индекса для преобразования между ними - это плохая идея. – azurefrog
Если комментарий ', используемый для разделения значения, сказал' проверять каждый символ в свою очередь', это вам поможет? –