Java 任意进制转换:Integer、BigInteger 与 2—36 进制
· 阅读需 2 分钟
Java 标准库可以直接完成 2 至 36 进制转换。其中数字 0—9 表示前 10 个数值,字母 a—z 表示 10—35。
十进制转换为其他进制
普通整数可以使用 Integer.toString:
int value = 255;
System.out.println(Integer.toString(value, 2)); // 11111111
System.out.println(Integer.toString(value, 8)); // 377
System.out.println(Integer.toString(value, 16)); // ff
System.out.println(Integer.toString(value, 36)); // 73
也可以使用常见进制的便捷方法:
Integer.toBinaryString(255);
Integer.toOctalString(255);
Integer.toHexString(255);
使用 BigInteger 转换大整数
数值超过 long 范围时,可以使用 BigInteger:
import java.math.BigInteger;
public class RadixConverter {
public static String fromDecimal(String decimal, int radix) {
validateRadix(radix);
return new BigInteger(decimal).toString(radix);
}
private static void validateRadix(int radix) {
if (radix < Character.MIN_RADIX ||
radix > Character.MAX_RADIX) {
throw new IllegalArgumentException(
"radix 必须在 2 到 36 之间"
);
}
}
public static void main(String[] args) {
String decimal = "123456789012345678901234567890";
System.out.println(fromDecimal(decimal, 2));
System.out.println(fromDecimal(decimal, 16));
System.out.println(fromDecimal(decimal, 36));
}
}
Character.MIN_RADIX 的值为 2,Character.MAX_RADIX 的值为 36。
任意进制转换为十进制
BigInteger value = new BigInteger("ff", 16);
System.out.println(value.toString(10)); // 255
构造方法的第二个参数表示输入字符串使用的进制。
两种进制直接转换
先按照源进制解析,再按照目标进制输出:
public static String convert(
String value,
int sourceRadix,
int targetRadix) {
validateRadix(sourceRadix);
validateRadix(targetRadix);
BigInteger number = new BigInteger(value, sourceRadix);
return number.toString(targetRadix);
}
System.out.println(convert("ff", 16, 2));
// 11111111
处理负数和字母大小写
System.out.println(new BigInteger("-255").toString(16));
// -ff
BigInteger.toString(radix) 默认输出小写字母。如果业务要求大写十六进制,可以调用:
String hex = new BigInteger("255")
.toString(16)
.toUpperCase();
常见错误
- 进制必须在 2—36 之间。
- 输入字符串不能包含当前进制不支持的字符。
- 非法输入会抛出
NumberFormatException。 - 需要转换大整数时,不要先解析为
int或long,否则可能在创建BigInteger前已经溢出。