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

C語言基礎練習:BCD 編碼解密(十六進制偽裝的十進制)

     編輯:關於C語言

C語言基礎練習:BCD 編碼解密(十六進制偽裝的十進制)

BCD(Binary-Coded Decimal)用一個字節存兩位十進制數:高4位存十位,低4位存個位。例如 0x12 表示十進制 12。但程序錯誤地將其當作二進制數轉十進制輸出:0x12 = 18。現給出錯誤輸出值(0~153),要求還原正確十進制數。

輸入輸出範例


輸入:18
輸出:12
解析:18(十進制) = 0x12(十六進制) → BCD解讀為 12

核心邏輯

  1. 輸入值 x 實際是 BCD 的十六進制表示被誤讀為十進制
  2. 將 x 轉回十六進制思維:高4位 = x / 16,低4位 = x % 16
  3. 還原十進制:result = (x / 16) * 10 + (x % 16)

完整代碼


#include <stdio.h>

int main() {
    int x;
    scanf("%d", &x);
    
    // x 實際上是十六制數值被當作十進制讀入
    // 例如輸入 18,實際十六進制 0x12
    // 高4位 = 18/16 = 1,低4位 = 18%16 = 2
    // BCD 值 = 1*10 + 2 = 12
    int result = (x / 16) * 10 + (x % 16);
    
    printf("%d\n", result);
    return 0;
}

數學等價性驗證

設 BCD 真實值為 ab(十進制),即 10*a + b。
其十六進制表示為 0xab = 16*a + b。
程序誤讀為十進制輸入 x = 16*a + b。
解碼:(x/16)*10 + x%16 = a*10 + b ✓

邊界條件

  • 輸入範圍 [0, 153]:對應 BCD 0x00 ~ 0x99(十進制 0~99)
  • 題目保證輸入合法:十六進制中無 A-F(即 x%16 ≤ 9 且 x/16 ≤ 9)

擴展:通用 BCD 轉換函數


// BCD 字節 → 十進制整數
int bcd_to_dec(unsigned char bcd) {
    return (bcd >> 4) * 10 + (bcd & 0x0F);
}

// 十進制整數 → BCD 字節
unsigned char dec_to_bcd(int dec) {
    return ((dec / 10) << 4) | (dec % 10);
}

// 多字節 BCD 陣列轉換
void bcd_array_to_dec(const unsigned char *bcd, int len, int *dec) {
    *dec = 0;
    for (int i = 0; i < len; i++) {
        *dec = *dec * 100 + bcd_to_dec(bcd[i]);
    }
}

應用場景

  • 嵌入式 RTC(實時時鐘)寄存器讀寫
  • 金融終端機、POS 機數據交換
  • 舊系統數據遷移、協議解析

總結

BCD 解碼本質是進制轉換與位操作的結合。關鍵洞察:輸入值是「十六進制數值被誤當作十進制讀入」。掌握 /16、%16、>>4、&0x0F 等位運算,能靈活處理各類編碼轉換問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved