> bcd | 十进制 | 二进制 <
// BCD - 二进制编码十进制,用于精确的小数运算
十进制精度
保留十进制精度,避免二进制浮点舍入误差。
半字节编码
每个十进制数字都精确编码为 4 位二进制(一个半字节)。
多种格式
支持 8421、2421、5421、Excess-3 和 Gray BCD 等编码。
>> 技术说明
BCD 的工作原理:
BCD 将每个十进制数字(0–9)编码为 4 位二进制。不同的 BCD 格式使用不同的位权:8421(标准加权)、2421(自补码)、5421(五进制混合编码)、Excess-3(每位数字加 3),以及 Gray BCD(最小化相邻值之间的位翻转)。压缩 BCD 以每字节存储两个数字,提高存储效率。
BCD 格式示例:
十进制: 9 5 3
8421 BCD: 1001 0101 0011
2421 BCD: 1111 1011 0011
5421 BCD: 1100 1000 0011
Excess-3: 1100 1000 0110
Gray BCD: 1101 0111 0010
压缩: 10010101 00110000
(95) (30)
为什么使用 BCD:
- >需要精确十进制表示的金融计算
- >数字显示器和七段数码管解码器
- >实时时钟电路
- >计算器与计算芯片
- >PLC 与工业控制系统
>> 常见问题
什么是 BCD?
BCD(二进制编码十进制,Binary-Coded Decimal)是一种使用二进制位表示十进制数字的编码方式,其中每个十进制数字都用 4 位二进制表示。它适用于对十进制精度要求很高的场景。
为什么要用 BCD 而不是二进制?
BCD 可以避免十进制计算中的舍入误差,并且更容易与十进制显示直接对应。它非常适合金融等需要精确小数表示的应用。
什么是压缩 BCD?
压缩 BCD(Packed BCD)在一个字节(8 位)中存储两个十进制数字,每个半字节代表一个数字。与每个数字使用一个完整字节的非压缩 BCD 相比更省空间。
常见的 BCD 格式有哪些?
常见的 BCD 格式包括:8421(标准加权)、2421(自补)、5421(五进制混合)、Excess-3(每位数字加 3)以及 Gray BCD(减少相邻数值之间的位变化)。
// 速查表
| Dec | 8421 | 2421 | Excess-3 |
|---|---|---|---|
| 0 | 0000 | 0000 | 0011 |
| 1 | 0001 | 0001 | 0100 |
| 2 | 0010 | 0010 | 0101 |
| 3 | 0011 | 0011 | 0110 |
| 4 | 0100 | 0100 | 0111 |
| 5 | 0101 | 1011 | 1000 |
| 6 | 0110 | 1100 | 1001 |
| 7 | 0111 | 1101 | 1010 |
| 8 | 1000 | 1110 | 1011 |
| 9 | 1001 | 1111 | 1100 |
// 代码示例
Decimal 25 BCD 0010 0101 (packed: 0x25)
Binary 0001 1001 (0x19)
Decimal 1234 BCD 0001 0010 0011 0100 (2 bytes, packed)
Overhead 4 bits per digit vs log2(10) = 3.32 bits -> ~20% larger
Add 0x19 + 0x28 = 0x41 -> +6 correction per nibble > 9 -> 0x47
>> 更多问题
问:BCD 是什么,与二进制有何不同?
答:BCD 用 4 位分别编码每个十进制数字。25 变为 0010 0101,而纯二进制是 11001。十进制数值保持精确,也便于显示。
问:什么是压缩 BCD 与非压缩 BCD?
答:压缩 BCD 每字节存两位数字(0x25 = 25)。非压缩 BCD 每位数字占一个字节,高半字节为 0 或像 EBCDIC 那样的区位标记。
问:为什么现在还在使用 BCD?
答:用于需要无舍入误差的精确十进制运算:金融系统、计算器、实时时钟和 7 段数码管。代价是每位 4 位而非 3.32 位,约多 20% 的空间。