跳到主要内容

Java 任意进制转换:Integer、BigInteger 与 2—36 进制

· 阅读需 2 分钟
Apache王也道长
软件开发者与技术作者

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
  • 需要转换大整数时,不要先解析为 intlong,否则可能在创建 BigInteger 前已经溢出。

本文阅读量:--

总访问量 -- · 访客数 --