Java Integer (及 Long) 提供了豐富的靜態方法支援進制間雙向轉換。本文系統整理 API、參數陷阱、負數補碼表示與大數處理方案。
| 轉換方向 | 二進制 (Base 2) | 八進制 (Base 8) | 十六進制 (Base 16) | 任意進制 (2-36) |
|---|---|---|---|---|
| 十進制 → 目標進制字符串 | toBinaryString(int) | toOctalString(int) | toHexString(int) | toString(int, radix) |
| 目標進制字符串 → 十進制 | valueOf(str, 2) | valueOf(str, 8) | valueOf(str, 16) | valueOf(str, radix) |
| 十進制 → 目標進制字符串 (帶符號) | toString(int, 2) | toString(int, 8) | toString(int, 16) | toString(int, radix) |
public class RadixConversionDemo {
public static void main(String[] args) {
int num = 255;
// === 十進制 → 其他進制字符串 (無符號表示) ===
System.out.println("二進制: " + Integer.toBinaryString(num)); // 11111111
System.out.println("八進制: " + Integer.toOctalString(num)); // 377
System.out.println("十六進制: " + Integer.toHexString(num)); // ff
System.out.println("Base-3: " + Integer.toString(num, 3)); // 100110
// === 十進制 → 其他進制字符串 (帶符號,toString 重載) ===
int negative = -255;
System.out.println("負數二進制: " + Integer.toString(negative, 2)); // -11111111
System.out.println("負數十六進制: " + Integer.toString(negative, 16)); // -ff
// === 其他進制字符串 → 十進制整數 ===
String binStr = "11111111";
String octStr = "377";
String hexStr = "FF";
String base3Str = "100110";
System.out.println("二進制解析: " + Integer.valueOf(binStr, 2)); // 255
System.out.println("八進制解析: " + Integer.valueOf(octStr, 8)); // 255
System.out.println("十六進制解析: " + Integer.valueOf(hexStr, 16)); // 255
System.out.println("Base-3解析: " + Integer.valueOf(base3Str, 3)); // 255
// === 等價寫法:parseInt vs valueOf ===
// parseInt 返回基本類型 int,valueOf 返回 Integer 對象 (自動拆箱)
int parsed = Integer.parseInt("FF", 16); // 推薦:避免自動拆箱開銷
Integer valued = Integer.valueOf("FF", 16);
}
}
Java 整數採用 二進制補碼 表示:
// -1 的補碼推導
// 1. 絕對值 1: 0000...0001 (32位)
// 2. 按位取反: 1111...1110
// 3. +1: 1111...1111 (32個1)
// Integer.toBinaryString(-1) 輸出: "11111111111111111111111111111111" (32位)
// 驗證:補碼特性:任意數 + 其負數 = 0 (溢出丟棄最高位)
int a = 255;
int b = -255;
System.out.println(Integer.toBinaryString(a + b)); // 0
| 輸入字符串 | 進制 | 結果 | 說明 |
|---|---|---|---|
| "FF" | 16 | 255 | 大小寫不敏感 |
| "-FF" | 16 | -255 | 支援負號前綴 |
| "+FF" | 16 | 255 | 支援正號前綴 |
| " FF " | 16 | 拋 NumberFormatException | 不自動 trim,需先 trim() |
| "1G" | 16 | 拋異常 | 字符超出進制範圍 (G>F) |
| "11111111111111111111111111111111" | 2 | -1 | 32位全1解析為 -1 (補碼) |
| "10000000000000000000000000000000" | 2 | 拋異常 | 超出 int 範圍 (-2^31 ~ 2^31-1),需用 Long.parseLong |
import java.math.BigInteger;
public class BigIntegerRadix {
public static void main(String[] args) {
// 超長十六進制字符串 (如 SHA-256 哈希)
String hexHash = "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
// 解析為 BigInteger
BigInteger big = new BigInteger(hexHash, 16);
System.out.println("十進制位數: " + big.toString().length()); // 78 位
// 轉換為其他進制
System.out.println("二進制: " + big.toString(2));
System.out.println("Base-36: " + big.toString(36)); // 0-9, a-z
// 從十進制字符串構建
BigInteger fromDec = new BigInteger("123456789012345678901234567890");
System.out.println("十六進制: " + fromDec.toString(16));
}
}
valueOf 自動裝箱/拆箱開銷toBinaryString 比 toString(i, 2) 略快 (內部優化)String.format("%08X", num) 固定 8 位十六進制大寫補零(num >> 4) & 0xF 取十六進制第 2 位,比字符串操作快數量級Color c = new Color(Integer.parseInt("FF8800", 16))if ((perm & 0b101) != 0) (Java 7+ 二進制字面量)Integer.parseInt(ip.replace(".", ""), 16) (需補零)bytesToHex(md5.digest()) → 十六進制字符串存儲BigInteger(base64Str, 64) 非標準進制解析掌握 Integer/Long/BigInteger 三層進制 API 體系,從基礎業務到密碼學場景遊刃有餘。