.NET `Convert` 類別提供標準進制互轉,支援 **2、8、10、16 進制**。本文整理核心 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);
}
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);
`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^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;` | 無需暫存變數 |
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;
}
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());
}