> bcd | 10進数 | 2進数 <
// BCD - 正確な10進演算のための 2進化10進数
10進精度
2 進数による丸め誤差を避けて、10 進の精度を保ちます。
ニブル単位のエンコード
各 10 進数字をちょうど 4 ビット (1 ニブル) で表現します。
複数のフォーマット
8421、2421、5421、Excess-3、Gray BCD などの BCD フォーマットに対応しています。
>> 技術情報
BCD の仕組み:
BCD では各 10 進数字 (0〜9) を 4 ビットの 2 進数で符号化します。BCD の各方式はビットの重み付けが異なります。8421 (標準)、2421 (自己補数型)、5421 (バイ・クイナリ)、Excess-3 (各数字に 3 を加算)、Gray BCD (ビットの変化を最小化) などがあります。パックド BCD では 1 バイトに 2 桁を格納し、効率を高めます。
BCD フォーマットの例:
10進数: 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 を使う理由:
- >正確な 10 進表現が必要な金融計算
- >デジタル表示器や 7 セグメント・デコーダ
- >リアルタイム・クロック回路
- >電卓や計算用チップ
- >PLC などの産業用制御システム
>> よくある質問
BCD とは何ですか?
BCD (Binary-Coded Decimal) は、各 10 進数字を対応する 4 ビットの 2 進数で表現するエンコード方式です。10 進の精度が重要な場面で利用されます।
なぜ通常の 2 進数ではなく BCD を使うのですか?
BCD を使うと 10 進計算における丸め誤差を抑えやすくなり、表示用の 10 進数への変換も簡単になります。正確な 10 進結果が求められる金融アプリケーションに適しています。
パックド BCD とは何ですか?
パックド BCD では 1 バイト (8 ビット) に 2 桁の 10 進数字を格納し、それぞれのニブルが 1 桁を表します。各桁に 1 バイトを使うアンパックド 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
>> その他の質問
Q: BCDとは何で、2進数とどう違いますか?
A: BCDは10進数の各桁を4ビットで個別に符号化します。25は 0010 0101 となり、純粋な2進数では 11001 です。10進の値が正確に保たれ、表示も簡単です。
Q: パックドBCDとアンパックドBCDとは?
A: パックドBCDは1バイトに2桁を格納します(0x25 = 25)。アンパックドは1桁に1バイトを使い、上位ニブルは0かEBCDICのようなゾーン指定です。
Q: なぜ今もBCDが使われるのですか?
A: 丸め誤差のない正確な10進演算が必要な金融システム、電卓、リアルタイムクロック、7セグメント表示などで使われます。代償は1桁4ビット(理論値3.32ビット)で、約20%多く容量を使うことです。