10進数の各桁を4ビットで表す方式。電卓や金融システムで2進数変換による誤差を避けるために使われます。
BCDのルールは1つだけです。10進数の各桁(0〜9)を、そのまま4ビットの2進数に変換する。これだけです。
・6(十の位)→ 0110
・5(一の位)→ 0101
・並べると「65」のBCDは 0110 0101
なぜ「桁ごと」に変換するのか?普通の2進数では数値全体をまとめて変換します(65 → 1000001)。しかしこれだと「元の10進数に戻すのが面倒」という問題があります。BCDは桁ごとに4ビットを使うので、4ビットずつ切り出すだけで元の10進数の各桁がすぐわかります。電卓のように「計算結果を人間が見やすい10進数でそのまま表示したい」場面でとても便利です。
身近なアナロジーで考えると、ロッカーの番号を「棟番号・階・部屋番号」に分けて書き留めるようなものです。全部つなげた数字より、区切って記録した方が元の意味がすぐわかりますね。BCDもそれと同じ発想です。上のツールで数値を入力すると、各桁が4ビットに変換される様子を確認できます。
BCD(Binary-Coded Decimal、2進化10進数)は、10進数の各桁をそれぞれ4ビットの2進数で表す方式です。例えば10進数の「935」は、9→1001、3→0011、5→0101 として「100100110101」と表します。
なぜBCDが必要なのでしょうか?通常の2進数では、10進数の「0.1」を正確に表現できず、丸め誤差が発生します。電卓で「0.1+0.2」を計算すると当然「0.3」ですが、普通の浮動小数点では「0.30000000000000004」のような誤差が出ます。BCDなら10進数の桁をそのまま保持するので、この問題が起きません。
通常の2進数とは異なり、10進数の桁構造をそのまま保持するのが特徴です。そのためお金の計算など「1円の誤差も許されない」場面で重宝されてきました。上のツールで数値を入力して、BCDと通常の2進数の違いを確認してください。
| 10進数 | BCD | 2進数 | BCDビット数 |
|---|---|---|---|
| 9 | 1001 | 1001 | 4 |
| 10 | 0001 0000 | 1010 | 8 |
| 99 | 1001 1001 | 1100011 | 8 |
| 100 | 0001 0000 0000 | 1100100 | 12 |
| 255 | 0010 0101 0101 | 11111111 | 12 |
表を見るとわかるように、BCDは通常の2進数よりビット数が多くなります。4ビットで表せるのは0〜15ですが、BCDでは0〜9しか使わないため6通り分が無駄になります。
たとえば「255」を通常の2進数で表すと「11111111」の8ビットで済みますが、BCDでは「0010 0101 0101」の12ビットが必要です。つまりBCDはメモリ効率が悪いのですが、10進数との変換が非常に簡単という大きなメリットがあります。各桁を4ビットずつ切り出すだけで元の10進数の各桁が分かるからです。
BCDで加算するとき、各桁の合計が9を超えたら+6(=0110)を加える補正が必要です。なぜ+6なのでしょうか?4ビットでは0〜15の16通りを表現できますが、BCDでは0〜9の10通りしか使いません。つまり10〜15の6通りが「使わない空白地帯」です。+6するとこの空白を飛び越えて次の桁に繰り上がるのです。
具体例を8+5で見てみましょう。まずそのまま加算すると 1000+0101=1101(10進では13)です。しかし1101はBCDとして無効(9超え)なので、+6補正します:1101+0110=10011。この「1」が繰り上がりで、残りの「0011」が3。結果は「繰上1、3」→13となり、正しい答えが得られます。
上のツールで「加算」モードに切り替えて、47+35、99+1などを試すと、どの桁で補正が発生するかステップごとに確認できます。試験では「BCD加算の補正」が頻出するので、「9を超えたら+6」を確実に覚えましょう。
BCDは「10進数との変換が簡単」という特徴を活かし、さまざまな分野で使われています。電卓はその代表例で、内部でBCD演算を行うことで「0.1+0.2=0.3」のような計算を誤差なく実行します。
金融システムでは、1円の誤差も許されないためBCDベースの演算が今でも使われます。COBOLの「PACKED-DECIMAL」がその代表例です。また7セグメントLEDの表示制御では、各桁のBCDを4本の信号線でそのままLEDドライバに送るだけで表示できます。10進→BCDの変換回路が不要なのが利点です。
その他、デジタル時計やカウンター、バーコード読み取り装置など、10進数をそのまま扱いたいハードウェアで広く使われています。上のツールでBCDへの変換を実際に試すと、「4ビットずつ切り出すだけで各桁がわかる」という手軽さを体感できます。
| 形式 | 1バイトの使い方 | 「93」の例 | 特徴 |
|---|---|---|---|
| パック | 1バイトに2桁 | 1001 0011 | 省メモリ |
| アンパック | 1バイトに1桁 | 0000 1001, 0000 0011 | 文字処理向き |
パック形式は1バイト(8ビット)に2桁分のBCDを詰める省メモリな形式です。たとえば「93」なら、上位4ビットに9(1001)、下位4ビットに3(0011)を入れて、1バイトで「10010011」となります。COBOLの内部表現でよく使われます。
アンパック形式は1バイトに1桁だけ入れ、上位4ビットは0やゾーンビット(例: 0011でASCIIの数字部分)を入れます。「93」なら「00001001, 00000011」の2バイトになります。メモリは倍使いますが、文字データとの変換が容易です。
試験ではパック形式が問われることが多く、「3桁の10進数をパック形式で表すと何バイト必要か?」といった問題が出ます。答えは2バイト(1バイトに2桁入るので、奇数桁は切り上げ)です。
BCDは4ビットのうだ10通り(0〜9)しか使わず、6通り分が無駄になるため、メモリ効率が約20%悪くなります。また加算ごとに+6補正が必要なため、回路が複雑になり計算速度も劣ります。さらに掛け算や割り算の実装は非常に複雑になります。
現代のプログラミングでは、JavaのBigDecimalやPythonのDecimalモジュールなど、ソフトウェアで精度を確保する方法が主流です。これらは内部的にはBCDと似た考え方(10進数の桁を保持)をソフトウェアで実現しています。
しかし基本情報技術者試験ではBCDの基本概念と加算補正が頻繁に出題されます。「BCDとは何か」「なぜ+6補正が必要か」「パック形式でのビット数」の3点をしっかり理解しておきましょう。