我还是java的新手 我有代码,但我仍然感到困惑它是如何工作的
所以任何人都可以向我解释我的代码如何将二进制转换为十六进制? 我对嵌套for循环部分有点混淆 所以请帮助我理解这里的逻辑
继承我的代码:
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)
您的代码确实有效,但效率低下。还有一些简化空间。
首先,你可以做些什么来提高你的程序效率,为二进制字符串构建一个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
抛出的异常,要么使用自己的函数来检查输入是否是有效的十六进制数。