BCD(Binary-Coded Decimal)用一個字節存兩位十進制數:高4位存十位,低4位存個位。例如 0x12 表示十進制 12。但程序錯誤地將其當作二進制數轉十進制輸出:0x12 = 18。現給出錯誤輸出值(0~153),要求還原正確十進制數。
輸入:18
輸出:12
解析:18(十進制) = 0x12(十六進制) → BCD解讀為 12
x 實際是 BCD 的十六進制表示被誤讀為十進制x 轉回十六進制思維:高4位 = x / 16,低4位 = x % 16result = (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)x%16 ≤ 9 且 x/16 ≤ 9)
// 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]);
}
}
BCD 解碼本質是進制轉換與位操作的結合。關鍵洞察:輸入值是「十六進制數值被誤當作十進制讀入」。掌握 /16、%16、>>4、&0x0F 等位運算,能靈活處理各類編碼轉換問題。