版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2012-4-15 15:32
|
显示全部楼层
今天有人在问我BCD码如何转换成10进制码的问题% i3 O! z( X& {! |& _3 }
其实很简单# w' v) C! o$ p+ G6 O
BCD 的表示法是 用4个二进制位来表示 一个十进制位,也就是一个字节能够表示2个十进制数位,这是一种压缩的十进制表示方式,应用很广,最常见的就是CMOS里的时间存放格& W2 S9 [' Q- m) {! P) z; V
4 G% L- H) @+ M9 ?6 @式就是BCD码格式,更具体的表示方法大家可以去百度一下就知道了不过其实知道我上面说的就差不多了。
+ @6 ?8 Q# l* G7 C9 F8 c) _' E" W. C+ J0 q明白了BCD是怎么表示后转换也就容易了,低4位和高4位分别转换然后合并起来就是了!
0 ?( V* w7 p# `9 [8 d如15用BCD码表示为 0001 01010 Q9 T, \2 \) W' u4 k1 i3 ~
低四位的值就是实现十进制数的低四,高4位就是高四位的值,这样我们有很高效的转换方法, Z# ~: o. o- E
低四位+高四位×10 (上面是2位十进制数的)
" E' i9 a$ h" |! m; x; H) q: q+ a0 g9 U" J& W* r) W* _7 U$ y
用C语言表达一下可能更能明白我上面说的意思0 ?8 Y& _& [, \
#include <stdio.h>- c8 v2 [: K; F! I" n
) S% y* z8 J. U
int main(void)
) X2 B! L2 h" ^2 ~& g) E" C! X9 F{
9 A0 |5 T2 M, U' \# B /** 15用BCD码表示为 0001 0101 **/+ E6 y- S7 C# ^% u1 L6 f
int bcd = 0x15;; @; U6 n3 v8 N% e) d
int dec;
7 n* C9 D% W$ Y0 H$ y& s3 E- q$ N0 j) M$ ?' N2 y; S
dec = (bcd & 15) + ((bcd>>4) * 10);& h) g' k: f; k8 u
& a2 }7 f% ^$ _" P" a
printf("%d\n",dec);
0 a& y0 x' H) b- C1 W2 U! k return 0;" h/ l- u3 a1 s* I$ R+ Y
}
, y+ w( _0 E3 ~2 s# q) j5 z1 X7 V, y* j4 \& W6 N
所以实际转换可以定义成一个宏
9 g: u8 _/ N$ U9 P' I#define BCDTODEC(bcd)
3 d0 \, w7 D/ _5 W0 `) p
! d' y2 b% B# K7 M- Z9 }; I6 y1 C! q5 z6 |* F
如" G( ?) P+ P* K, ~" ~
#include <stdio.h>
9 V6 X- v& h( n( R4 ^5 t#define BCDTODEC(bcd) ((bcd) = ((bcd) & 15) + ((bcd)>>4) * 10)* A/ }: X+ ]* O0 O$ Z! |8 x7 e: i
int main(void)2 ~; o) M R, U
{+ B: l% {( y' [7 P2 G4 d( _
/** 15用BCD码表示为 0001 0101 **/
`3 [( h$ y9 z1 I' W int bcd = 0x15;
0 }5 L# N7 q3 E0 c* Q$ l BCDTODEC(bcd);5 K) `, o Q7 L6 }7 w8 D* M* V- q% y
printf("%d\n",bcd);
" C. x7 c9 S0 B; X" L) X+ g- |/ |8 z return 0;( \+ Y3 ~' L! ]: B4 c5 z
} |
|