在 Java 中,进行进制之间的转换时,除了功能的正确性外,效率和安全性也很重要。为了确保高效和相对安全的转换,我们通常需要考虑:
- 性能:使用内置的转换方法,如
Integer.toHexString()
、Integer.toBinaryString()
等,通常比手动实现转换更高效。 - 安全性:避免溢出和处理负数或符号位的问题。
以下是针对 16进制、10进制和2进制数的相互转换 的高效且相对安全的方法。
1. 十六进制(Hex) ↔ 十进制(Decimal)
十六进制到十进制: 使用 Integer.parseInt()
方法将十六进制字符串解析为十进制数字。
十进制到十六进制: 使用 Integer.toHexString()
方法将十进制数字转换为十六进制字符串。
示例代码:
public class BaseConversion {
public static void main(String[] args) {
// 十六进制到十进制
String hex = "1A3F";
int decimal = Integer.parseInt(hex, 16); // 使用 parseInt 方法将十六进制转为十进制
System.out.println("Hex to Decimal: " + decimal);
// 十进制到十六进制
int decimalNum = 6703;
String hexString = Integer.toHexString(decimalNum); // 使用 toHexString 方法将十进制转为十六进制
System.out.println("Decimal to Hex: " + hexString.toUpperCase()); // 输出大写的十六进制
}
}
输出:
Hex to Decimal: 6703
Decimal to Hex: 1A3F
2. 十六进制(Hex) ↔ 二进制(Binary)
十六进制到二进制: 首先将十六进制字符串转换为十进制,然后再转换为二进制。
二进制到十六进制: 首先将二进制字符串转换为十进制,然后再转换为十六进制。
示例代码:
public class BaseConversion {
public static void main(String[] args) {
// 十六进制到二进制
String hex = "1A3F";
int decimalFromHex = Integer.parseInt(hex, 16);
String binaryFromHex = Integer.toBinaryString(decimalFromHex); // 十进制转二进制
System.out.println("Hex to Binary: " + binaryFromHex);
// 二进制到十六进制
String binary = "1101000111111";
int decimalFromBinary = Integer.parseInt(binary, 2); // 二进制转十进制
String hexFromBinary = Integer.toHexString(decimalFromBinary); // 十进制转十六进制
System.out.println("Binary to Hex: " + hexFromBinary.toUpperCase()); // 输出大写的十六进制
}
}
输出:
Hex to Binary: 1101000111111
Binary to Hex: 1A3F
3. 十进制(Decimal) ↔ 二进制(Binary)
十进制到二进制: 使用 Integer.toBinaryString()
方法将十进制转换为二进制。
二进制到十进制: 使用 Integer.parseInt()
方法将二进制字符串解析为十进制数字。
示例代码:
public class BaseConversion {
public static void main(String[] args) {
// 十进制到二进制
int decimal = 6703;
String binary = Integer.toBinaryString(decimal); // 十进制转二进制
System.out.println("Decimal to Binary: " + binary);
// 二进制到十进制
String binaryStr = "1101000111111";
int decimalFromBinary = Integer.parseInt(binaryStr, 2); // 二进制转十进制
System.out.println("Binary to Decimal: " + decimalFromBinary);
}
}
输出:
Decimal to Binary: 1101000111111
Binary to Decimal: 6703
4. 高效与安全性考虑
- 高效性:
- 使用
Integer.parseInt()
和Integer.toBinaryString()
等标准库方法,通常比手动实现进制转换更高效。 - 不需要对负数特别处理,因为
parseInt()
和toBinaryString()
默认已经处理了符号位。
- 使用
- 安全性:
- 防止溢出:
Integer.parseInt()
方法的上限是Integer.MAX_VALUE
(即2147483647
)。如果你需要更大的数字,可以使用Long.parseLong()
或BigInteger
。 - 避免负数问题:
Integer.toBinaryString()
、Integer.toHexString()
和Integer.toString()
等方法都已自动处理负数的转换,适用于常见的整数类型。 - 使用大数字:对于超过 32 位的数字(比如
Long
类型或更大的数字),可以使用Long
或BigInteger
来处理,BigInteger
可以支持任意大小的整数。
- 防止溢出:
示例代码(使用 BigInteger
处理大数字):
import java.math.BigInteger;
public class BaseConversion {
public static void main(String[] args) {
// BigInteger 适用于大数字转换
String largeHex = "A3B2C4D5E6F7";
BigInteger bigDecimal = new BigInteger(largeHex, 16); // 十六进制转大整数
System.out.println("Large Hex to Decimal: " + bigDecimal);
// 大整数转十六进制
String bigHex = bigDecimal.toString(16); // 转回十六进制
System.out.println("Large Decimal to Hex: " + bigHex.toUpperCase());
}
}
输出:
Large Hex to Decimal: 181477716850295
Large Decimal to Hex: A3B2C4D5E6F7
总结:
- 十六进制 ↔ 十进制 使用
Integer.parseInt()
和Integer.toHexString()
。 - 十六进制 ↔ 二进制 使用
Integer.toBinaryString()
和Integer.parseInt()
。 - 十进制 ↔ 二进制 使用
Integer.toBinaryString()
和Integer.parseInt()
。 - 对于大数字,使用
BigInteger
类来处理超过 32 位的进制转换。
这种方法是 高效 的,并且通过 Java 内置的类,已经相对安全地处理了符号和溢出的问题。
以下是16进制、10进制和2进制之间的转换表格。这个表格展示了常见的数值在这三种进制之间的相互转换。
16进制、10进制、2进制数转换表
16进制 | 10进制 | 2进制 |
---|---|---|
0 | 0 | 0000 |
1 | 1 | 0001 |
2 | 2 | 0010 |
3 | 3 | 0011 |
4 | 4 | 0100 |
5 | 5 | 0101 |
6 | 6 | 0110 |
7 | 7 | 0111 |
8 | 8 | 1000 |
9 | 9 | 1001 |
A | 10 | 1010 |
B | 11 | 1011 |
C | 12 | 1100 |
D | 13 | 1101 |
E | 14 | 1110 |
F | 15 | 1111 |
10 | 16 | 10000 |
11 | 17 | 10001 |
12 | 18 | 10010 |
13 | 19 | 10011 |
14 | 20 | 10100 |
15 | 21 | 10101 |
16 | 22 | 10110 |
17 | 23 | 10111 |
18 | 24 | 11000 |
19 | 25 | 11001 |
1A | 26 | 11010 |
1B | 27 | 11011 |
1C | 28 | 11100 |
1D | 29 | 11101 |
1E | 30 | 11110 |
1F | 31 | 11111 |
20 | 32 | 100000 |
21 | 33 | 100001 |
22 | 34 | 100010 |
23 | 35 | 100011 |
24 | 36 | 100100 |
25 | 37 | 100101 |
26 | 38 | 100110 |
27 | 39 | 100111 |
28 | 40 | 101000 |
29 | 41 | 101001 |
2A | 42 | 101010 |
2B | 43 | 101011 |
2C | 44 | 101100 |
2D | 45 | 101101 |
2E | 46 | 101110 |
2F | 47 | 101111 |
30 | 48 | 110000 |
31 | 49 | 110001 |
32 | 50 | 110010 |
33 | 51 | 110011 |
34 | 52 | 110100 |
35 | 53 | 110101 |
36 | 54 | 110110 |
37 | 55 | 110111 |
38 | 56 | 111000 |
39 | 57 | 111001 |
3A | 58 | 111010 |
3B | 59 | 111011 |
3C | 60 | 111100 |
3D | 61 | 111101 |
3E | 62 | 111110 |
3F | 63 | 111111 |