進位制轉換核心方法
| 轉換方向 | 方法 | 範例 |
| 二進制 → 十進制 | 權位相加 | 1011₂ = 1×8 + 0×4 + 1×2 + 1×1 = 11₁₀ |
| 十進制 → 二進制 | 除 2 取餘 (整數)、乘 2 取整 (小數) | 13₁₀: 13/2=6..1, 6/2=3..0, 3/2=1..1, 1/2=0..1 → 1101₂ |
| 八進制/十六進制 | 3/4 位元分組對照 | 101101₂ = 55₈ = 2D₁₆ |
位元運算完整指南
| 運算子 | 名稱 | 真值表 | 常用技巧 |
& | AND | 1&1=1, 其他=0 | 遮罩、檢查旗標、取模 2ⁿ (x & (n-1)) |
| | OR | 0|0=0, 其他=1 | 設定旗標、合併位元 |
^ | XOR | 相異=1, 相同=0 | 切換旗標、交換變數、校驗和 |
~ | NOT | 0→1, 1→0 | 取補數、清除旗標 (~(1<) |
<< | 左移 | 向高位移動、低位補 0 | 乘 2ⁿ、建立遮罩 (1<) |
>> | 右移 | 有號: 算術右移 (複製符號位) 無號: 邏輯右移 (補 0) | 除 2ⁿ、取高位元組 |
二進制補數表示 (Two's Complement)
// 8-bit 範例
// 正數:最高位 0
5 = 0000 0101
// 負數:正數按位取反 + 1
-5 = 1111 1010 + 1 = 1111 1011 (0xFB)
// 特殊值
-128 = 1000 0000 (最小值,無對應正數)
127 = 0111 1111 (最大值)
-1 = 1111 1111 (全 1)
// 優點:加減法統一、無負零、硬體簡單
IEEE 754 浮點數編碼 (單精度 float 32-bit)
┌─┬───────────┬────────────────────────────────────┐
│S│ 指數 (8) │ 尾數 (23) │
└─┴───────────┴────────────────────────────────────┘
S: 符號位 (0=正, 1=負)
指數: 偏移量 127 (Exponent Bias),實際指數 = 存儲值 - 127
尾數: 隱含前導 1 (1.尾數),非正規化數隱含 0
特殊值編碼
| 值 | 符號 | 指數 | 尾數 | 十六進制 |
| +0 | 0 | 00000000 | 000...0 | 0x00000000 |
| -0 | 1 | 00000000 | 000...0 | 0x80000000 |
| +∞ | 0 | 11111111 | 000...0 | 0x7F800000 |
| -∞ | 1 | 11111111 | 000...0 | 0xFF800000 |
| NaN | x | 11111111 | 非零 | 0x7FC00000+ |
C# 位元操作實用 API
// .NET Core 3.0+ BitOperations (硬體內建)
BitOperations.PopCount((uint)x) // 1 的個數
BitOperations.LeadingZeroCount(x) // 前導零數
BitOperations.TrailingZeroCount(x) // 尾隨零數
BitOperations.Log2(x) // ⌊log₂x⌋
BitOperations.RotateLeft(x, n) // 循環左移
BitOperations.RotateRight(x, n) // 循環右移
// 舊版手工實作
int CountBits(uint x) {
x -= (x >> 1) & 0x55555555;
x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
return (int)((x * 0x11111111) >> 24);
}
實務應用場景
- 旗標枚舉
[Flags] enum Permission { Read=1, Write=2, Execute=4 }
- 位元欄位壓縮儲存 (資料庫、網路封包)
- Bloom Filter、HyperLogLog 概率資料結構
- 圖形學:顏色通道提取
(color >> 16) & 0xFF (R)
- 快速數學:
x & 1 判斷奇偶、x >> 1 除 2





本文對應《叩響 C# 之門》第 1.5 節二進制教學內容