Я все еще новичок в 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);
}
}
Ваш код работает, но он неэффективен. Там также есть место для упрощения.
Прежде всего, что вы можете сделать, чтобы сделать вашу программу более эффективной, постройте 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
вашу собственную функцию, которая будет проверять, является ли ввод действительным шестнадцатеричным числом.