C語言:十進(jìn)制,BCD碼互換詳解
最近寫單片機 RTC 日期、時間配置,需要實現(xiàn)十進(jìn)制、BCD碼互換,將示例Demo分享給各位朋友:

BCD是指用二進(jìn)制來表示十進(jìn)制數(shù)的編碼,即:用4位二進(jìn)制來表示一位十進(jìn)制數(shù),因此4位二進(jìn)制數(shù)表示最大的十進(jìn)制數(shù)9(1001)。
一個四位的BCD碼不能夠表達(dá)十進(jìn)制的兩位數(shù),因此當(dāng)數(shù)字大于九時,我們需要用八位BCD碼來表示。高位只需要逢九進(jìn)一即可。
十進(jìn)制是逢十進(jìn)一,而十六進(jìn)制是逢十六進(jìn)一,它們之間的每次進(jìn)位差6,所以一個十進(jìn)制數(shù)要轉(zhuǎn)換成BCD碼,要先算清多進(jìn)位的位數(shù)。
當(dāng)兩個BCD碼相加,如果和等于或小于 1001(即十進(jìn)制數(shù)9),不需要修正。

如果相加之和在 1010 到1111(即十六進(jìn)制數(shù) 0AH~0FH)之間,則需加 6 進(jìn)行修正。

例如,十進(jìn)制99進(jìn)位了99/10=9次,每次進(jìn)位和十六進(jìn)制進(jìn)位相比差6,所以一共差了9×6=54,即BCD碼為:99+54=153(十六進(jìn)制:0X99)。BCD碼轉(zhuǎn)化成十進(jìn)制碼也一樣原理。
1、復(fù)雜版
十進(jìn)制轉(zhuǎn)換為BCD碼,代碼如下所示:
int decimal_bcd_code(int decimal)
{
int sum = 0; //sum返回的BCD碼
for (int i = 0; decimal > 0; i++)
{
sum |= ((decimal % 10 ) << ( 4*i));
decimal /= 10;
}
return sum;
}
BCD碼轉(zhuǎn)換為十進(jìn)制,代碼如下所示:
int bcd_decimal_code( int bcd)
{
int sum = 0, c = 1; // sum返回十進(jìn)制,c每次翻10倍
for(int i = 1; bcd > 0; i++)
{
if( i >= 2)
{
c*=10;
}
sum += (bcd%16) * c;
bcd /= 16; // 除以16同理與十進(jìn)制除10將小數(shù)點左移一次,取余16也同理
}
return sum;
}
2、簡易版
十進(jìn)制轉(zhuǎn)換為BCD碼,代碼如下所示:
int bcd_decimal_code( int bcd)
{
return (bcd + (bcd/10) * 6);
}
BCD碼轉(zhuǎn)換為十進(jìn)制,代碼如下所示:
int decimal_bcd_code(int decimal)
{
return (decimal - (decimal>>4) * 6);
}
參考資料:
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
COLORREF,COLOR,RGB,CString的轉(zhuǎn)化總結(jié)分析
實際的軟件開發(fā)過程中,常需要用到非.net平臺的代碼。這時候就可能碰到ColorRef(也就是以int類型代表的顏色值或是以DWORD值表示的顏色)。這跟.net平臺下的顏色的相互轉(zhuǎn)換MS并沒有直接實現(xiàn)2013-09-09
C語言中實現(xiàn)“17進(jìn)制”轉(zhuǎn)“10進(jìn)制”實例代碼
這篇文章主要介紹了C語言中實現(xiàn)“17進(jìn)制”轉(zhuǎn)“10進(jìn)制”實例代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05

