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

C語言 BCD 碼與二進制互轉:Linux 內核實現原理解析

     編輯:關於C

BCD 碼(Binary-Coded Decimal) 以 4 位二進制編碼一位十進制數字(0-9),常用於會計、儀表顯示、RTC 實時時鐘等要求十進制精確的場景。本文解析 Linux 內核中的 bcd2bin / bin2bcd 實現,揭示「4 位一組、乘除 10」的核心邏輯。

BCD 碼 vs 二進制:本質區別

核心轉換算法

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 轉換。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性二進制 (BIN)BCD 碼
編碼單位整體數值每個十進制位獨立編碼
十進制 170x11 (0001 0001)0x17 (0001 0111)
十進制 990x63 (0110 0011)0x99 (1001 1001)
算術運算硬件直接支持需軟件修正(加 6 法)
存儲效率高(8 位表達 0-255)低(8 位僅表達 0-99)