BCD码

500px-Binary_clock.svg.png

概述

标记方法:
十进制数: '1234'd中 个位数字4,十位数字3,百位数字2,千位数字1,都是十进制数的一位,称为十进制位。
BCD(Binary Coded Decimal)码,是指用二进制数对十进制数进行的编码,每个十进制位由一个固定bit的二进制数表示。

非压缩BCD(unpacked BCD): 指一个字节(8 bits)表示一个十进制位。
压缩BCD(pBCD(packed BCD)): 指半字节(nibble, 4 bits)表示一个十进制位。

当然也有一些特殊模式来表示符号位或者错误、溢出等其他信息。

基础 Basics

最常见的BCD码称为8421码,用4个bit来表示一个十进制位,这种BCD也称为”natural BCD(NBCD)”.
还有其他编码方式,如”4221” 或者 “7421”.
这些表示方法的命名方法使用了每个位的权重(weighting)。

Decimal Digit BCD 8421 BCD 4221 BCD 8 4 -2 -1 ASCII 8421
0 0 0 0 0 0 0 0 0 0 0 0 0 00110000
1 0 0 0 1 0 0 0 1 0 1 1 1 00110001
2 0 0 1 0 0 0 1 0 0 1 1 0 00110010
3 0 0 1 1 0 0 1 1 0 1 0 1 00110011
4 0 1 0 0 1 0 0 0 0 1 0 0 00110100
5 0 1 0 1 1 0 0 1 1 0 1 1 00110101
6 0 1 1 0 1 1 0 0 1 0 1 0 00110110
7 0 1 1 1 1 1 0 1 1 0 0 1 00110111
8 1 0 0 0 1 1 1 0 1 0 0 0 00111000
9 1 0 0 1 1 1 1 1 1 1 1 1 00111001

非压缩BCD使用8个bit来表示1个十进制位:

1
2
Decimal: 6 2 8
Binary : 00000110 00000010 00001000

在非压缩BCD中高4位全是0,可以记为00008412码;
压缩BCD利用了8421码只使用4为就可以表示0-9,所以只用4位表示一个十进制位,压缩了数据, 提高了压缩效率。

1
2
Decimal: 6 2 8
Binary : 0000 0110 0010 1000

由于计算机中以字节为最小访问单位,压缩BCD中半字节需要补全为一个字节。如上例中628,其实是0628.

有符号数 Signed Integer

非压缩BCD表示方法

S0008421BCD的最高bit位是符号位,为0认为是正数,为1则为负数。

1
2
Decimal: -13
Binary : 10000001 00000011

压缩BCD表示方法

对于有符号数,需要用一个半字节来表示符号。

Sign Digit BCD 8421 Sign Note
A 1 0 1 0 +
B 1 0 1 1 -
C 1 1 0 0 + EBCDIC
D 1 1 0 1 - EBCDIC
E 1 1 1 0 +
F 1 1 1 1 -

EBCDIC字符集使用C为+,D为-,使用大端模式,最低半字节表示符号。

1
2
3
number: -1234
Decimal: 1 2 3 4 -
Binary : 0001 0010 0011 0100 1101

浮点数 Float

浮点数可以使用约定俗成的方法来表示,如约定小数点后只有2位。
123C表示+1.23;100D表示+1.00

应用

在一些时钟芯片的寄存器采用BCD码形式输出。0x12,0x34,0x56可以表示12:34:56.
如M41T0 real time clock的日期和时间格式都是以压缩BCD码表示。

M41T_rt_bcd_reg.png

Reference:

  1. BCD wiki