BCD(2進化10進数)って何?:Q&Aで学ぶマイコン講座(67)(2/3 ページ)
マイコンユーザーのさまざまな疑問に対し、マイコンメーカーのエンジニアがお答えしていく本連載。今回は、初級者の方からよく質問される「BCD(2進化10進数)って何?」についてです。
BCDとは?
BCDとは、10進数の1桁を、0から9までを表す2進数の4桁で表現したものです。表1に、0から15までの10進数と、それぞれに対応する2進数、16進数およびBCDを示します。
10進数の0から9までは、16進数と同じなので、BCDに変換する必要はありません。しかし、10進数の10から15までは、16進数では英字になってしまうので、変換しなければなりません。例えば10進数の「10」は、16進数では「A」です。これをBCDに変換すると10になって、1桁上がります。2進数の4桁では9までしか表現できないため、さらに2進数の4桁を追加して、8桁で表現することになります。
表1には、10進数の15までしか示していませんが、これよりも大きい数字も同じように変換されます。例えば、10進数の20は16進数で14ですが、BCDで20に変換されます。また、10進数の30は16進数で1Eですが、BCDで30に変換されます。10進数の10より大きい数字については、次ページで詳しく解説します。
BCDへの変換方法
BCDへ変換する方法は、比較的簡単です。数値の大きさによって6の倍数を加えれば良いだけです。演算結果をチェックして、9よりも大きい数であれば、6を加えます。9以下であれば何もしません(表2)
BCDで9よりも大きい数字を表現するには、2進数の8桁が必要ですので、上位に4桁が追加されます。9よりも大きい数に6を加えると、必ず4桁目にキャリーが発生します。このキャリーをハーフキャリーと呼びます。マイコン内部でBCD変換の演算を行う際には、ハーフキャリーをチェックすることによって、9よりも大きい数を判別します。
ハーフキャリーについては、「Q&Aで学ぶマイコン講座(66):CCR(Condition Code Register:条件コードレジスタ)の役割」のH(ハーフキャリービット)を参照してください。
10進数の9から15まで、すなわち16進数のAからFまでには6を加えることでBCDに変換できます。
さらに、それよりも大きい数字の変換方法を表3に示します。ここでは、10進数の10から39(16進数のAから27)を示します。10進数の10から19の場合は6、20から29の場合は12、30から39の場合は18を加えます。このように、数の大きさによって6の倍数を加えることで、簡単にBCDに変換できます。
「簡単にBCDに変換できます」と書きましたが、実はこれをソフトウェアで実現するのは結構面倒です。入門編の本記事では詳しく解説しませんが、興味のある方は是非調べてみてください。基本は10で割った商に6をかけて、元の数字に加えれば良いのですが、さらに効率良く変換するさまざま々なアルゴリズムが紹介されています。
マイコン内部のハードウェアでは、商を求めるのが難しい*1)ので、各ビットの値をチェックして、それに応じて6の倍数を加算する回路が使われます。
例えば、マイコンに内蔵されているリアルタイムクロック(以下、RTC:Real Time Clock)で取り扱う数字を考えてみます。RTCとは時刻クロックタイマーで、時計とカレンダー機能を実現する機能です。
分や秒を計算する際の最大値は59です。時刻の最大値は12または24です。そのため、BCDに変換する最大値を59や24に制限できます。すなわち、一般的なBCDで2桁を表す場合でも、RTCに限定すれば8ビット全部を必要としないで、6ビットや7ビットで表現できます。さらに1の位と10の位で分けて変換するように設計すれば、ハードウェアの論理規模も最適化できます。
実際にマイコンに搭載されているRTCのBCDレジスタを次ページで解説します。
Copyright © ITmedia, Inc. All Rights Reserved.