Java 的 Integer
类提供了丰富的进制转换方法,支持在十进制、二进制、八进制、十六进制以及其他任意进制之间进行转换。这些方法在处理底层数据、协议解析、算法题等场景中非常实用。
一、核心进制转换方法概览
方法 | 功能 | 示例 |
---|---|---|
toBinaryString() |
转二进制字符串 | Integer.toBinaryString(10) → "1010" |
toOctalString() |
转八进制字符串 | Integer.toOctalString(10) → "12" |
toHexString() |
转十六进制字符串 | Integer.toHexString(255) → "ff" |
toString(int, int) |
转任意进制字符串 | Integer.toString(100, 3) → "10201" |
parseInt(String, int) |
从任意进制字符串解析为 int | Integer.parseInt("1010", 2) → 10 |
二、十进制 → 其他进制(编码)
1. 转二进制:toBinaryString()
int num = 42;
String binary = Integer.toBinaryString(num);
System.out.println(binary); // 输出: 101010
// 补零到固定长度(如8位)
String padded = String.format("%8s", binary).replace(' ', '0');
System.out.println(padded); // 输出: 00101010
2. 转八进制:toOctalString()
int num = 64;
String octal = Integer.toOctalString(num);
System.out.println(octal); // 输出: 100
3. 转十六进制:toHexString()
int num = 255;
String hex = Integer.toHexString(num);
System.out.println(hex); // 输出: ff
// 转大写
String hexUpper = Integer.toHexString(num).toUpperCase();
System.out.println(hexUpper); // 输出: FF
// 补零
String formatted = String.format("%04x", num); // 4位,不足补0
System.out.println(formatted); // 输出: 00ff
4. 转任意进制:toString(int, int)
int num = 100;
// 转三进制
String ternary = Integer.toString(num, 3);
System.out.println(ternary); // 输出: 10201
// 转三十六进制(最大支持36)
String base36 = Integer.toString(num, 36);
System.out.println(base36); // 输出: 2s
✅ 支持进制范围:2 ~ 36
使用 0-9 和 a-z 表示数字
三、其他进制 → 十进制(解码)
1. 从二进制字符串解析
String binaryStr = "1010";
int num = Integer.parseInt(binaryStr, 2);
System.out.println(num); // 输出: 10
2. 从八进制字符串解析
String octalStr = "17";
int num = Integer.parseInt(octalStr, 8);
System.out.println(num); // 输出: 15
3. 从十六进制字符串解析
String hexStr = "FF";
int num = Integer.parseInt(hexStr, 16);
System.out.println(num); // 输出: 255
// 支持 0x 前缀(需手动处理)
String hexWithPrefix = "0xFF";
if (hexWithPrefix.startsWith("0x")) {
hexWithPrefix = hexWithPrefix.substring(2);
}
int value = Integer.parseInt(hexWithPrefix, 16);
4. 从任意进制解析
String numStr = "10201";
int decimal = Integer.parseInt(numStr, 3); // 从三进制解析
System.out.println(decimal); // 输出: 100
四、完整示例:进制转换工具类
public class NumberConverter {
// 十进制转任意进制
public static String toBase(int number, int radix) {
if (radix < 2 || radix > 36) {
throw new IllegalArgumentException("进制必须在 2-36 之间");
}
return Integer.toString(number, radix);
}
// 任意进制转十进制
public static int fromBase(String numberStr, int radix) {
if (radix < 2 || radix > 36) {
throw new IllegalArgumentException("进制必须在 2-36 之间");
}
// 移除可能的 0x, 0b, 0 前缀
String cleanStr = numberStr.toLowerCase();
if (cleanStr.startsWith("0x")) {
cleanStr = cleanStr.substring(2);
radix = 16;
} else if (cleanStr.startsWith("0b")) {
cleanStr = cleanStr.substring(2);
radix = 2;
} else if (cleanStr.startsWith("0") && cleanStr.length() > 1) {
cleanStr = cleanStr.substring(1);
radix = 8;
}
return Integer.parseInt(cleanStr, radix);
}
// 格式化输出
public static void printAllBases(int num) {
System.out.printf("十进制: %d%n", num);
System.out.printf("二进制: %s%n", Integer.toBinaryString(num));
System.out.printf("八进制: %s%n", Integer.toOctalString(num));
System.out.printf("十六进制: %s%n", Integer.toHexString(num).toUpperCase());
}
}
// 使用示例
NumberConverter.printAllBases(255);
// 输出:
// 十进制: 255
// 二进制: 11111111
// 八进制: 377
// 十六进制: FF
五、使用技巧与最佳实践
1. ✅ 使用 String.format()
格式化输出
int num = 255;
System.out.println(String.format("0x%04X", num)); // 输出: 0x00FF
System.out.println(String.format("0b%8s",
Integer.toBinaryString(num)).replace(' ', '0')); // 输出: 0b11111111
2. ✅ 处理负数
int negative = -10;
String bin = Integer.toBinaryString(negative);
System.out.println(bin);
// 输出: 11111111111111111111111111110110 (32位补码)
负数以补码形式输出,包含符号位。
3. ✅ 位运算与进制转换结合
// 提取特定位
int num = 0b1101_0101;
int low4Bits = num & 0xF; // 取低4位
System.out.println(Integer.toBinaryString(low4Bits)); // 输出: 101
// 检查某位是否为1
boolean isBit3Set = (num & (1 << 3)) != 0;
六、常见错误与注意事项
❌ 1. 进制超出范围
// 错误:进制必须在 2-36 之间
Integer.toString(100, 1); // 抛出 NumberFormatException
Integer.toString(100, 37); // 抛出 NumberFormatException
❌ 2. 字符串包含非法字符
// 错误:二进制字符串不能包含 2
Integer.parseInt("102", 2); // 抛出 NumberFormatException
❌ 3. 空字符串或 null
Integer.parseInt(null, 10); // NullPointerException
Integer.parseInt("", 10); // NumberFormatException
❌ 4. 数值溢出
// 字符串表示的数超出 int 范围
Integer.parseInt("9999999999", 10); // 抛出 NumberFormatException
✅ 注意事项:
- 大小写敏感:
parseInt("ff", 16)
正确,parseInt("GG", 16)
错误 - 无自动前缀识别:
parseInt("0xFF", 16)
会失败,需手动处理 - 负数支持:字符串可包含负号
-
七、性能优化建议
- ✅ 避免频繁转换:在循环中提前转换好进制
- ✅ 使用 StringBuilder:大量字符串拼接时
- ✅ 缓存常用转换结果:如 2 的幂次方的二进制表示
- ✅ 考虑使用位运算替代:如
n % 2 == 0
可用(n & 1) == 0
替代
八、总结
需求 | 推荐方法 |
---|---|
十进制 → 二进制 | Integer.toBinaryString() |
十进制 → 八进制 | Integer.toOctalString() |
十进制 → 十六进制 | Integer.toHexString() |
十进制 → 任意进制 | Integer.toString(num, radix) |
任意进制 → 十进制 | Integer.parseInt(str, radix) |
格式化输出 | String.format() |