| 特性 | 二進制 (BIN) | BCD 碼 |
| 編碼單位 | 整體數值 | 每個十進制位獨立編碼 |
| 十進制 17 | 0x11 (0001 0001) | 0x17 (0001 0111) |
| 十進制 99 | 0x63 (0110 0011) | 0x99 (1001 1001) |
| 算術運算 | 硬件直接支持 | 需軟件修正(加 6 法) |
| 存儲效率 | 高(8 位表達 0-255) | 低(8 位僅表達 0-99) |
核心轉換算法
BCD → 二進制
unsigned bcd2bin(unsigned char val) {
return (val & 0x0f) + (val >> 4) * 10;
}
邏輯:
val & 0x0f 取低 4 位 → 個位數字。
val >> 4 取高 4 位 → 十位數字。
- 十位 × 10 + 個位 = 二進制值。
例:0x17 → (7) + (1)×10 = 17。
二進制 → BCD
unsigned char bin2bcd(unsigned val) {
return ((val / 10) << 4) + (val % 10);
}
邏輯:
val / 10 得十位數字,<< 4 移至高 4 位。
val % 10 得個位數字,置於低 4 位。
- 兩部分相加(實際是按位或,因無重疊位)。
例:17 → (1<<4) + 7 = 0x10 + 0x07 = 0x17。
完整測試代碼
#include
#include
unsigned bcd2bin(unsigned char val) {
return (val & 0x0f) + (val >> 4) * 10;
}
unsigned char bin2bcd(unsigned val) {
return ((val / 10) << 4) + (val % 10);
}
int main() {
unsigned val = 17;
printf("bin: %u ---> 0x%x\n", val, val); // 17 -> 0x11
printf("bcd: %u ---> 0x%x\n", bin2bcd(val), bin2bcd(val)); // 17 -> 0x17 (23)
return 0;
}
運行結果
bin: 17 ---> 0x11
bcd: 23 ---> 0x17
解讀:二進制 17 (0x11) 轉 BCD 為 0x17,若按十進制讀取 0x17 即為 23。這正是 BCD「看起來像十進制,實為二進制存儲」的特性。
BCD 運算修正規則(補充知識)
兩個 BCD 碼相加時,若結果 > 9 或產生進位,需加 6 (0x06) 修正:
- 二進制是逢 16 進 1,十進制是逢 10 進 1,差值 6。
- 例:0x08 + 0x05 = 0x0D (13) → 加 6 → 0x13 (BCD 表示 13) ✓
總結
BCD 與二進制互轉的核心是「4 位一組,乘除 10」:
- BCD→BIN:拆高低 4 位,高位×10+低位。
- BIN→BCD:除 10 取商餘,商左移 4 位與餘數合成。
Linux 內核實現極致精簡,無循環、無分支,嵌入式開發、RTC 驅動、金融終端必備技能。理解其原理,亦能靈活擴展至任意位寬 BCD 轉換。
- 上一篇文章: C語言 typedef struct 詳解:別名、標簽與跨語言差異
- 下一篇文章: Linux內核整數平方根算法:位運算迭代逼近實現
Copyright ©
程式碼之家 All Rights Reserved