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

C# 進制轉換完全指南:2/8/10/16 進制互轉、自定義進制與位運算技巧

     編輯:關於C語言

前言

.NET `Convert` 類別提供標準進制互轉,支援 **2、8、10、16 進制**。本文整理核心 API、自定義進制實作、位運算技巧、大數處理與格式化輸出,涵蓋面試常考與實務開發場景。

Convert 核心 API


// 任意進制字串 → int (支援 2, 8, 10, 16)
int value = Convert.ToInt32("1010", 2);    // 10
int value = Convert.ToInt32("12", 8);      // 10
int value = Convert.ToInt32("A", 16);      // 10

// int → 任意進制字串 (支援 2, 8, 10, 16)
string binary = Convert.ToString(10, 2);   // "1010"
string octal = Convert.ToString(10, 8);    // "12"
string hex = Convert.ToString(10, 16);     // "a"

// 通用轉換方法
public string ConvertBase(string value, int fromBase, int toBase)
{
    if (fromBase < 2 || fromBase > 36 || toBase < 2 || toBase > 36)
        throw new ArgumentException("Base must be 2-36");
    int num = Convert.ToInt32(value, fromBase);
    return Convert.ToString(num, toBase);
}

格式化輸出:ToString 格式字串


int n = 255;
n.ToString("X")      // "FF" (大寫十六進制)
n.ToString("x")      // "ff" (小寫)
n.ToString("X8")     // "000000FF" (補齊 8 位)
n.ToString("D5")     // "00255" (十進制補齊 5 位)

// 組合格式化
$"{n:X4}"           // "00FF"
string.Format("{0:X4}", n);

自定義進制 (3-36 進制) 實作

`Convert` 僅支援 2/8/10/16。任意進制需自行實作:


private const string Digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

public string ToBase(long value, int baseNum)
{
    if (baseNum < 2 || baseNum > 36) throw new ArgumentException("Base 2-36");
    if (value == 0) return "0";
    
    bool neg = value < 0;
    ulong v = (ulong)(neg ? -value : value);
    var chars = new List();
    
    while (v > 0)
    {
        chars.Add(Digits[(int)(v % (ulong)baseNum)]);
        v /= (ulong)baseNum;
    }
    if (neg) chars.Add('-');
    chars.Reverse();
    return new string(chars.ToArray());
}

public long FromBase(string value, int baseNum)
{
    if (baseNum < 2 || baseNum > 36) throw new ArgumentException("Base 2-36");
    value = value.Trim().ToUpperInvariant();
    bool neg = value.StartsWith("-");
    if (neg) value = value[1..];
    
    long result = 0;
    foreach (char c in value)
    {
        int digit = Digits.IndexOf(c);
        if (digit < 0 || digit >= baseNum) throw new FormatException($"Invalid digit '{c}' for base {baseNum}");
        result = result * baseNum + digit;
    }
    return neg ? -result : result;
}

位運算技巧:快速 2 的冪次運算

操作位運算說明
乘以 2^n`x << n`左移 n 位
除以 2^n (整數)`x >> n`算術右移 (保留符號)
模 2^n`x & ((1 << n) - 1)`取低 n 位
判斷 2 的冪次`(x & (x - 1)) == 0 && x > 0`二進制僅一個 1
取下一個 2 的冪次見下方代碼向上取整到 2^n
交換兩變數`a ^= b; b ^= a; a ^= b;`無需暫存變數

下一個 2 的冪次 (Branchless)


public int NextPowerOf2(int x)
{
    if (x <= 1) return 1;
    x--;
    x |= x >> 1;
    x |= x >> 2;
    x |= x >> 4;
    x |= x >> 8;
    x |= x >> 16;
    return x + 1;
}

大數進制轉換 (BigInteger)


using System.Numerics;

BigInteger big = BigInteger.Parse("123456789012345678901234567890");
string hex = big.ToString("X"); // 十六進制
string bin = ToBaseBigInteger(big, 2); // 需自行實作或迴圈除 2

// 自定義 BigInteger 進制轉換
public string ToBaseBigInteger(BigInteger value, int baseNum)
{
    if (value == 0) return "0";
    var digits = new List();
    BigInteger b = baseNum;
    while (value > 0)
    {
        digits.Add(Digits[(int)(value % b)]);
        value /= b;
    }
    digits.Reverse();
    return new string(digits.ToArray());
}

實務場景範例

  1. 顏色值轉換:`ColorTranslator.ToHtml(Color.Red)` → `"#FF0000"` / `Color.FromArgb(0xFF0000)`
  2. 權限位遮罩:`Read=1, Write=2, Execute=4` → `user.Permission = Read | Write` (3) → `(permission & Write) != 0` 判斷寫入權限
  3. Base64 編碼:`Convert.ToBase64String(bytes)` / `Convert.FromBase64String(str)` (非標準進制,但常用)
  4. 短網址 ID:`ToBase(id, 62)` (0-9a-zA-Z) 產生短碼
  5. IPv4 地址整數化:`(ip[0]<<24)|(ip[1]<<16)|(ip[2]<<8)|ip[3]` ↔ `Convert.ToString(ipInt, 2)` 顯示二進制

總結

  • **標準 2/8/10/16 進制**:`Convert.ToInt32(str, base)` / `Convert.ToString(num, base)` + `ToString("Xn")` 格式化。
  • **任意 2-36 進制**:自行實作除基取餘 / 霍納法則累加,字元表 `0-9A-Z`。
  • **位運算**:2 的冪次乘除模、權限遮罩、快速判斷、交換變數 —— **效能敏感熱路徑首選**。
  • **大數**:`System.Numerics.BigInteger` 配合自定義進制轉換。
  • **避坑**:`Convert` 不支援負數非十進制字串 (如 `Convert.ToInt32("-10", 2)` 拋異常),需自行處理符號。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved