情報処理技術者試験を受験する方にとって、BCD(Binary-Coded Decimal:二進化十進数)は基本情報技術者試験や応用情報技術者試験でしばしば出題される重要な概念です。BCDは理論だけでなく、金融システムやデジタル計測機器など、端数誤差が許されない実務でも広く使われています。本記事では、BCDの基本から応用まで、図表を交えてわかりやすく解説します。
1. BCDとは何か
BCD(Binary-Coded Decimal)とは、十進数の各桁を二進数で表現する方式です。コンピュータ内部では通常、数値は純粋な二進数(バイナリ)で表現されますが、人間が扱う十進数との変換で端数誤差が生じることがあります。BCDはこの問題を解決するために開発された表現方法です。
BCDと純粋二進数の違い
例として、十進数の「123」を考えてみましょう。
純粋な二進数での表現:
123₁₀ = 1111011₂
BCDでの表現(各桁を4ビットで表現):
1₁₀ = 0001₂
2₁₀ = 0010₂
3₁₀ = 0011₂
よって、123₁₀ = 0001 0010 0011₍BCD₎
図1:BCDと二進数の比較
2. BCDの種類と表現方法
1. パックBCD(Packed BCD)
最も一般的なBCD形式で、各十進桁を4ビットで表現します。8ビット(1バイト)で2桁の十進数を格納できます。
例:十進数の25は、パックBCDでは 0010 0101 と表現されます。
図2:パックBCD
2. アンパックBCD(Unpacked BCD)
各十進桁を8ビット(1バイト)で表現する方式です。上位4ビットは通常0(または他の用途に使用)で、下位4ビットに十進数の値を格納します。
例:十進数の25は、アンパックBCDでは 0000 0010 0000 0101 と表現されます。
図3:アンパックBCD
3. 符号付きBCD
数値の符号を表現するために、最下位バイトの上位4ビットに符号コードを格納する方式です。よく使われる符号コードは以下の通りです:
- 正数(+):1100₂ (C)
- 負数(-):1101₂ (D)
例:+25は 0010 0101 1100、-25は 0010 0101 1101 と表現されます。
図4:符号付きBCD
3. BCDの計算方法
BCD加算
BCD加算は通常の二進加算と似ていますが、各桁の結果が9を超える場合(すなわち、4ビット表現で1010〜1111となる場合)は調整が必要です。
BCD加算の手順:
- 通常の二進加算を行う
- 結果が9を超える場合、または桁上がり(キャリー)が発生した場合:
- 6 (0110₂)を加える
- キャリーを次の桁に伝える
例: BCD形式での 28 + 35 の計算
0010 1000 (28 in BCD)
+ 0011 0101 (35 in BCD)
= 0101 1101 (二進加算の結果)
一の位は 1101₂ = 13 > 9 なので調整が必要:
0101 1101
+ 0000 0110 (6を加える)
= 0110 0011
最終結果: 0110 0011 (BCD) = 63₁₀
図5:BCD加算
BCD減算
BCD減算は、補数を使用するか、または直接減算して調整する方法があります。直接減算の場合、結果が負になる桁には調整が必要です。
例: BCD形式での 85 – 57 の計算
1000 0101 (85 in BCD)
- 0101 0111 (57 in BCD)
= 0010 1110 (二進減算の結果)
一の位は 1110₂ = 14 となり、これは有効なBCD桁ではないため調整が必要:
0010 1110
- 0000 0110 (6を引く)
= 0010 1000
最終結果: 0010 1000 (BCD) = 28₁₀
図6:BCD減算
4. 情報処理技術者試験でのBCD出題パターン
情報処理技術者試験では、BCDに関する問題が以下のようなパターンで出題されることがあります:
- 数値変換問題: 十進数とBCDの相互変換(基本情報で頻出)
- 演算問題: BCD形式での加算・減算(特に調整が必要なケース)
- コード識別問題: 異なるコード体系(BCD、純粋二進数、16進数など)の識別
- 符号付きBCD問題: 符号の解釈と演算
- 実装問題: BCD形式のデータを処理するアルゴリズムやプログラムの理解
BCDに関する問題は、基本情報技術者試験では数値表現の基礎として、応用情報技術者試験ではより実践的な場面での応用として出題されることが多いです。過去問を分析すると、BCDの変換と演算に関する問題の出題率は比較的高く、重点的に対策すべき分野と言えます。
サンプル問題
次の十進数をパックBCD形式で表現せよ。
(1) 739
(2) -42
(1) 739 = 0111 0011 1001₍BCD₎
(2) -42 = 0100 0010 1101₍BCD₎ (最後の1101は負符号)
5. 練習問題と解答例
問題1
十進数の248をパックBCD形式で表現せよ。
248₁₀ = 0010 0100 1000₍BCD₎
問題2
BCD形式の 0110 0001 0111 を十進数に変換せよ。
0110 0001 0111₍BCD₎ = 617₁₀
問題3
BCD形式での 47 + 36 の加算を行え。
0100 0111 (47 in BCD)
+ 0011 0110 (36 in BCD)
= 0111 1101 (二進加算の結果)
一の位は 1101₂ = 13 > 9 なので調整が必要:
0111 1101
+ 0000 0110 (6を加える)
= 1000 0011
最終結果: 1000 0011 (BCD) = 83₁₀
問題4
符号付きBCDで表現された 0111 1000 1100 を十進数に変換せよ。
0111 1000 1100₍BCD₎ 最後の1100は正符号(+)を表す
よって、十進数では +78