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

✅ 注意事项:

  1. 大小写敏感parseInt("ff", 16) 正确,parseInt("GG", 16) 错误
  2. 无自动前缀识别parseInt("0xFF", 16) 会失败,需手动处理
  3. 负数支持:字符串可包含负号 -

七、性能优化建议

  1. 避免频繁转换:在循环中提前转换好进制
  2. 使用 StringBuilder:大量字符串拼接时
  3. 缓存常用转换结果:如 2 的幂次方的二进制表示
  4. 考虑使用位运算替代:如 n % 2 == 0 可用 (n & 1) == 0 替代

八、总结

需求 推荐方法
十进制 → 二进制 Integer.toBinaryString()
十进制 → 八进制 Integer.toOctalString()
十进制 → 十六进制 Integer.toHexString()
十进制 → 任意进制 Integer.toString(num, radix)
任意进制 → 十进制 Integer.parseInt(str, radix)
格式化输出 String.format()