首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 進制轉換完全指南:Integer 靜態方法與進制字符串解析雙向詳解

     編輯:Java 相關知識

Java 進制轉換:從十進制到二/八/十六進制的標準 API 全覽

Java Integer (及 Long) 提供了豐富的靜態方法支援進制間雙向轉換。本文系統整理 API、參數陷阱、負數補碼表示與大數處理方案。

核心 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);
    }
}

負數補碼表示原理:為什麼 toBinaryString(-1) 是 32 個 1?

Java 整數採用 二進制補碼 表示:

  • 正數:最高位 0,其餘位為絕對值二進制
  • 負數:最高位 1,其餘位為絕對值 按位取反 + 1

// -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"16255大小寫不敏感
"-FF"16-255支援負號前綴
"+FF"16255支援正號前綴
" FF "16拋 NumberFormatException不自動 trim,需先 trim()
"1G"16拋異常字符超出進制範圍 (G>F)
"11111111111111111111111111111111"2-132位全1解析為 -1 (補碼)
"10000000000000000000000000000000"2拋異常超出 int 範圍 (-2^31 ~ 2^31-1),需用 Long.parseLong

大數進制轉換:BigInteger 完美支援任意精度


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));
    }
}

效能優化建議

  • 熱點路徑用 parseInt/parseLong:避免 valueOf 自動裝箱/拆箱開銷
  • 固定進制用專用方法:toBinaryString 比 toString(i, 2) 略快 (內部優化)
  • 格式化輸出用 String.format:String.format("%08X", num) 固定 8 位十六進制大寫補零
  • 位運算替代進制轉換:(num >> 4) & 0xF 取十六進制第 2 位,比字符串操作快數量級

常見應用場景速查

  • 顏色值處理: Color c = new Color(Integer.parseInt("FF8800", 16))
  • 權限位掩碼: if ((perm & 0b101) != 0) (Java 7+ 二進制字面量)
  • 網絡地址: IP 解析 Integer.parseInt(ip.replace(".", ""), 16) (需補零)
  • 哈希/加密: bytesToHex(md5.digest()) → 十六進制字符串存儲
  • Base64 變體: BigInteger(base64Str, 64) 非標準進制解析

掌握 Integer/Long/BigInteger 三層進制 API 體系,從基礎業務到密碼學場景遊刃有餘。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved