FE EXAM

BCD2進化10進数)

10進数の各桁を4ビットで表す方式。電卓や金融システムで2進数変換による誤差を避けるために使われます。

BCD CONVERTER
10進
BCD
2進
補正
10進数
935
BCD
100100110101
2進数
1110100111
ビット数
BCD:12 / 2進:10
モード
10進数935
09999
プリセット
解説

📌
BCDの核心 — 10進1桁を4ビットで表す

6565011001010110 = 60101 = 5BCDビット列0110 01014ビット区切りで切り出せば元の10進数の桁がすぐわかる

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とは

10進数の各桁をそのまま4ビットで表す910013001150101

BCDBinary-Coded Decimal2進化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進数の違いを確認してください。

📌
通常の2進数との違い

10進数BCD2進数BCDビット数
9100110014
100001 000010108
991001 100111000118
1000001 0000 0000110010012
2550010 0101 01011111111112

表を見るとわかるように、BCDは通常の2進数よりビット数が多くなります4ビットで表せるのは0〜15ですが、BCDでは0〜9しか使わないため6通り分が無駄になります。

たとえば「255」を通常の2進数で表すと「11111111」の8ビットで済みますが、BCDでは「0010 0101 0101」の12ビットが必要です。つまりBCDはメモリ効率が悪いのですが、10進数との変換が非常に簡単という大きなメリットがあります。各桁を4ビットずつ切り出すだけで元の10進数の各桁が分かるからです。

📌
BCD加算の補正ルール

例: 8 + 5 = 13Step 1: そのまま加算1000+0101=1101Step 2: 9超え⇒+6補正1101+0110=10011結果繰上1, 0011 → 13

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進計算金融誤差なしの通貨計算7セグLED桁ごとの表示10進数をそのまま扱いたい場面で活躍

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の限界と現代の代替手段

BCD: メモリ効率が悪い代替: BigDecimal等現代ではソフトウェアで精度を確保するのが主流

BCDは4ビットのうだ10通り(0〜9)しか使わず、6通り分が無駄になるため、メモリ効率が約20%悪くなります。また加算ごとに+6補正が必要なため、回路が複雑になり計算速度も劣ります。さらに掛け算や割り算の実装は非常に複雑になります。

現代のプログラミングでは、JavaBigDecimalPythonDecimalモジュールなど、ソフトウェアで精度を確保する方法が主流です。これらは内部的にはBCDと似た考え方(10進数の桁を保持)をソフトウェアで実現しています。

しかし基本情報技術者試験ではBCDの基本概念と加算補正が頻繁に出題されます。「BCDとは何か」「なぜ+6補正が必要か」「パック形式でのビット数」の3点をしっかり理解しておきましょう。

練習問題

🎯
基本情報技術者 練習問題

Q1.10進数「73」をBCDで表したビット列はどれか。
A.01110011
B.01001001
C.01000011
D.00110111
Q2.BCD加算で「8 + 5」を計算するとき、必要な補正はどれか。
A.補正不要
B.+6 の補正
C.-6 の補正
D.+10 の補正

関連コンテンツ