一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 5981|回复: 6
收起左侧

BCD码转十进制

[复制链接]
发表于 2012-4-15 15:04 | 显示全部楼层 |阅读模式
  private static int IntToBCD(int i) //十进制转BCD
& e7 ^" X$ X1 K/ D; }) G. z' m        {  ~' i. c3 B! U9 u/ a% u7 E* M
            return (((i / 10) << 4) + ((i % 10) & 0x0f));
) ]& J$ D4 x( K' ~        }' U! P% Y6 y' g( r# ^( q/ v" |
        private static int BCDToInt(byte bcd) //BCD转十进制
2 s/ X( m- x. Y2 b. e        {+ g8 }' [' k% `( C4 a/ e! t' {& v9 I
            return (0xff & (bcd >> 4)) * 10 + (0xf & bcd);
+ Y6 H  w& q  j2 }* ]3 G% a        }% Y, Y( V4 Q6 p2 m) O- I1 D+ u# p6 M5 _
发表于 2012-4-15 15:25 | 显示全部楼层
private static int BCDToInt(byte bcd) //BCD转十进制: H$ A8 ?* }/ [: u% a: m
        {! N7 P- W/ @/ A; H2 u5 L6 b
            return (0xff & (bcd >> 4)) * 10 + (0xf & bcd);
! F! F4 ^1 E& D3 W4 y        }
4 ~% E% B& v" c! p( V+ y
* a4 K! T9 g* x, S( x' Y. c* j8 B至少这里错了。
发表于 2012-4-15 15:26 | 显示全部楼层
private static int IntToBCD(int i) //十进制转BCD
' W/ H/ Y8 t  e: L        {
5 w  [0 H6 x- ?! {            return (((i / 10) << 4) + ((i % 10) & 0x0f));3 K8 H1 C, Z8 j0 G: J) x
        }
5 J% p: g% u; R, ^& R( f) \' u; A8 \# H% T( T! X
考虑一下红色部分是否必要。
发表于 2012-4-15 15:28 | 显示全部楼层
还有,
* m. j2 \1 X: D- vprivate static int IntToBCD(int i)& a6 u9 d$ c$ L, }
红色部分改为byte比较安全。
 楼主| 发表于 2012-4-15 15:32 | 显示全部楼层
今天有人在问我BCD码如何转换成10进制码的问题5 a, F+ h9 J% |0 v& k
其实很简单, ]! d% w" N1 G; a# F
BCD 的表示法是 用4个二进制位来表示 一个十进制位,也就是一个字节能够表示2个十进制数位,这是一种压缩的十进制表示方式,应用很广,最常见的就是CMOS里的时间存放格
# x0 W2 L5 ]1 O  L2 ?/ x
- e$ Y* C' O) f$ W& g1 V6 ?0 Q5 l式就是BCD码格式,更具体的表示方法大家可以去百度一下就知道了不过其实知道我上面说的就差不多了。
- \$ c2 V" U( J' p! }* ?7 Z明白了BCD是怎么表示后转换也就容易了,低4位和高4位分别转换然后合并起来就是了!
+ s1 q/ }) c# F, b! l# d+ R4 Q- ~如15用BCD码表示为 0001 01011 x3 Y. [8 S6 ~' f/ l
低四位的值就是实现十进制数的低四,高4位就是高四位的值,这样我们有很高效的转换方法
4 z% r) N4 A7 N  I8 G5 S低四位+高四位×10 (上面是2位十进制数的)9 w/ I2 j# z' _/ ?& O
8 Y$ E" b, ]2 h! x
用C语言表达一下可能更能明白我上面说的意思
* A, h: e* z' [; R" D  l6 L" M9 S$ ]; r#include <stdio.h>, Y: W/ I# f6 d) g8 _! H9 W2 _: G

1 v1 T- A/ O/ C- H( m) Sint main(void)
' t6 l3 |: h$ v{0 t9 d% A! b+ L% h
    /** 15用BCD码表示为 0001 0101 **/
/ H1 d) J. R, @) M+ H6 J    int bcd = 0x15;
" E; g; p$ |  L+ {" v    int dec;
: j7 k8 H- B+ I% W% `1 N- x4 P$ W4 w" n/ _% T3 d
    dec = (bcd & 15) + ((bcd>>4) * 10);4 {# G- p) ^! Z
4 A# j3 R; [- V0 L
    printf("%d\n",dec);6 G: Z7 r3 Y6 x" o5 R
    return 0;- @( N2 A( r9 Z! y; S+ a
}8 G, K9 Z- u& o8 q' q8 D
; a9 P6 D2 q$ j' Z
所以实际转换可以定义成一个宏0 ]0 t1 ^* I7 L3 \
#define BCDTODEC(bcd)& v7 r; F7 `2 Q, ?6 b! A
# v9 @6 k' B9 v) @/ o6 W6 j

- x+ L% t* W8 ]
6 Q: k% }7 I* P1 c& ]#include <stdio.h>
3 O& P% s; ~( m/ y! |; U7 n#define BCDTODEC(bcd) ((bcd) = ((bcd) & 15) + ((bcd)>>4) * 10)
9 w6 ~6 l  K+ d! }' r$ q$ K5 Zint main(void)0 ?* B8 k0 X- c3 F; d4 }& s7 o1 Q- Q
{  g; v5 X0 p/ O
    /** 15用BCD码表示为 0001 0101 **/9 i. O+ d) }+ d: z2 ?
    int bcd = 0x15;
( q5 F5 Z+ h! j) Z    BCDTODEC(bcd);
0 {. H7 e: K7 S2 S% ]6 c; d8 J. F    printf("%d\n",bcd);, C* d! ?  S! ]- }( u
    return 0;8 b8 K  Q3 `2 D$ o# x
}
 楼主| 发表于 2012-4-15 16:12 | 显示全部楼层
private static int BCDToInt(byte bcd) //BCD转十进制
0 d4 y* Q% ^4 F0 }# p        {
' c! S# E- s0 N2 C$ D  V2 Y            return (0xff & (bcd >> 4 ...
5 Q5 e' x" X/ c4 S- z+ xchjj0 发表于 2012-4-15 15:25 https://www.yleee.com.cn/images/common/back.gif
8 I+ n% c; H/ P' V% m
7 y  B$ A6 a6 y

3 ]9 ?+ Z; Y7 g% J8 s  S   说得对0xff其实并没有用的,谢谢提醒。
 楼主| 发表于 2012-4-15 16:18 | 显示全部楼层
其实BCD 码的转换其实是加减权的方法来实现的,够10的话就左移这样就变成BCD码,右移就变成进制。

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-4-29 15:25 , Processed in 0.059238 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表