BCD码以及各进制之间的相互转换

目录

前言

一、BCD码

二、进制互转

1、任意进制转十进制:系数X基数 ^ 权值(累加)

2、任意进制转二进制


前言

主要学习什么是BCD码,以及二进制、八进制、十进制、十六进制之间的相互转换

一、BCD码

BCD码就是以四位二进制数为一个单位来表示相应的十进制数、十六进制数如下图:

  图1-1

 图中可以看到0-9位 几个进制的BCD码都是以二进制的正常形式换算,从十开始的BCD码开始不一样了起来。

BCD码:以四位二进制数为一单位来表示一个数。例如:十进制数10的BCD码为0001 0000;显而易见后四位的0000 表示的是十进制的个位,0001则就是十位了。十六进制转BCD码也是同理。

通常的两位BCD码转换:

BCD码转十进制:DEC = BCD / 16 * 10 ^ 1 + BCD % 16 * 10 ^ 0 ;

详解:先将BCD的前一位提出BCD/16,再提出BCD后一位BCD%16。最后将两位数转十进制。多位BCD码同理。

十进制转BCD码:BCD = DEC / 10 * 16 + DEC % 10 ;同上分别提出高低两位,做BCD转换。

二、进制互转

1、任意进制转十进制:系数X基数 ^ 权值累加

(1110)二转十 =  1 * 2 ^ 3 + 1 * 2 ^ 2 + 1 * 2 ^ 1 + 0 * 2 ^ 0 

(27)   八转十 =   2 * 8 ^ 1 + 7 * 8 ^ 0    

(11)十六转十 =  1 * 16 ^ 1 + 1 * 16 ^ 0

(0x11)十六转二转十 = 0001 0001 >>> 0 * 2 ^ 7 .... + 1 * 2 ^ 4 + 0 + 1 * 2 ^0

2、任意进制转二进制


//递归
void decToBin(int n)
{
    int a;
    a = n%2;
    n /= 2;
    if(n==0)
        ;
    else
        decToBin(n);
    cout<<a;
}

### 十进制BCD的方法与实现 #### 方法概述 十进制转换BCD的核心在于处理每一位十进制数字并将其映射到对应的四位二进制表示。由于BCD本质上是以每位十进制数字为基础的编方式,因此可以通过逐位提取十进制数中的每一位,并将其转化为4位二进制来完成整个过程。 一种常见的算法是通过计算十进制数值中因逢十进一而导致的额外十六进制进位差异来进行调整[^3]。具体而言,对于给定的十进制数`n`,其转换BCD的方式可以总结为以下公式: \[ \text{BCD} = n + (\lfloor n / 10 \rfloor) \times 6 \] 其中,\(\lfloor n / 10 \rfloor\) 表示整除操作的结果,用于统计十进制数中发生的进位次数,乘以6则是为了弥补每发生一次进位所造成的十六进制与十进制间的差距。 #### 示例代实现 以下是基于上述公式的C语言实现,展示了如何将十进制转换BCD: ```c #include <stdio.h> // 将十进制转换BCD uint8_t DEC2BCD(uint8_t dec) { return (dec + (dec / 10) * 6); } int main() { uint8_t decimal_number = 99; uint8_t bcd_result = DEC2BCD(decimal_number); printf("Decimal: %d -> BCD: 0x%X\n", decimal_number, bcd_result); return 0; } ``` 在此代片段中,函数 `DEC2BCD` 接收一个十进制输入值,并按照前述公式返回相应的BCD结果。例如,当输入为99时,程序会输出 `0x99`,这正是对应于十进制数99的BCD。 另外,在某些场景下可能需要逆向操作即将BCD还原为十进制数,下面提供了一个简单的反向转换函数作为补充说明: ```c static uint8_t BCD2DEC(uint8_t bcd) { return (bcd - ((bcd >> 4) * 6)); } ``` 这段代实现了从BCD回退至原始十进制数值的功能,利用右移运算符获取高位部分以便减去多余的偏移量。 #### 注意事项 需要注意的是,以上方法适用于较小范围内的十进制数(通常不超过两位),因为标准单字节BCD只能表达最大值为99的情况。如果涉及更大规模的数据,则需扩展数据结构或者采用其他更复杂的方案加以支持。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Samuel·糕狩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值