Binárisan kódolt decimális számábrázolás
Ez a szócikk nem tünteti fel a független forrásokat, amelyeket felhasználtak a készítése során. Emiatt nem tudjuk közvetlenül ellenőrizni, hogy a szócikkben szereplő állítások helytállóak-e. Segíts megbízható forrásokat találni az állításokhoz! Lásd még: A Wikipédia nem az első közlés helye. |
A számítástechnikában és az elektronikus rendszerekben a binárisan kódolt decimális – Binary-Coded Decimal (BCD) a decimális számok egy kódolási formája, amelyben minden számjegyet egy-egy bitsorozat ábrázol.
Ezzel a módszerrel a számok konverziója és megjelenítése lényegesen egyszerűbbé válik. Ugyanakkor valamivel több elektronikus áramkörre van szükség a aritmetikai számításokhoz, és tárolóterületet veszítünk a bináris ábrázoláshoz képest. Ennek ellenére ez a kódolási eljárás fontos és használatos még ma is.
A BCD-nél egy számjegynek általában 4 bit felel meg, amelyek általában a 0–9 karaktereket is jelentik. Más kombinációkat is használnak az előjelek és egyebek jelzésére.
Alapok
[szerkesztés]Egy decimális szám BCD kódolása egy gyakran alkalmazott kódolási eljárás, ami minden számjegy kódolásához egy négy bites bináris formát használ. Például a 127 kódolva:
0001 0010 0111
Mivel a legtöbb számítógép az adatokat 8 bites byte-okban tárolja, két megoldás használatos arra, hogy a 4 bites BCD számjegyeket byte-okon tárolják:
- minden számjegyet egy byte-on tárolnak, a második négy bit ekkor minden esetben 0000 (az EBCDIC kódnál), vagy 0011 ( ASCII kódnál)
- két számjegyet tárolnak minden byte-on.
A tiszta bináris ábrázolással szemben, nagy számok esetében a megjelenítés egyszerűen csak nibble-nként történhet, azonos logika felhasználásával. A tiszta binárisból decimálisba való konverzió bonyolult, és a szorzási vagy osztási műveletek használatát igényli, és pontosság is kérdéses. Több PC BIOS-a a dátum- és idő értéket BCD formában tárolja és kezeli, valószínűleg történeti okokból, (hogy elkerüljék a ASCII konverziót.)
A BCD az elektronikában
[szerkesztés]A BCD nagyon elterjedt az elektronikában, ahol numerikus értékeket kell megjeleníteni, és erre a rendszerben digitális logika vagy mikroprocesszor nem áll rendelkezésre. A BCD használatával a megjelenítendő számjegyek kezelése sokkal egyszerűbb, minden számjegyhez egy saját, és számjegyenként azonos logika tartozik, a szokásos 7 szegmens kijelzők is egy ilyen rendszerhez illeszthetők egyszerűen. Ha a numerikus értéket tisztán binárisan tárolná és kezelné a rendszer, akkor a megjelenítéshez egy komplex áramköri logika kellene, gondoskodni kellene a felesleges nullák elnyomásáról stb. Fentiek miatt a BCD kódolás célszerűsége, a viszonylag egyszerű aritmetika széles körű elterjedtséget biztosít az elektronikában a tiszta bináris ábrázolással szemben.
Hasonló érvek hozhatók fel akkor is, ha úgynevezett "beágyazott" mikrokontrollert vagy mikroprocesszort is tartalmaz az áramkör. Kevesebb kód szükséges a BCD kezeléséhez, a konverziókhoz a kijelzés egyszerűbb. Fentiek miatt néhány mikrokontroller és mikroprocesszor rendelkezik már direkt BCD utasításokkal, amivel tovább egyszerűsíthető a BCD kódolású adatok kezelése.
Tömörített vagy pakolt – packed – BCD
[szerkesztés]Széles körben elterjedt variáció a két-számjegy-per-byte kódolás, amely "pakolt BCD" vagy "tömörített BCD" néven közismert. Itt a szám a számjegyeket és végén az előjelet jelenti: általában 1100 a pozitív és 1101 a negatív. Pakolt BCD formában a 127-et a 00010010 01111100 byte-ok jelentik, és a mínusz 127-et pedig a 00010010 01111101.
Ugyan a tömörített BCD nem optimális a tárolás szempontjából (nagyjából a rendelkezésre álló terület 1/6-a veszteség a tömörített BCD esetében) az EBCDIC és ASCII konverzió, valamint a Unicode különböző változataiba való konverzió egyszerű, nem igényel külön aritmetikai lépéseket. Léteznek nagyobb tömörítettségű BCD változatok, itt a tárterület kihasználtsága optimáis, szintén nem igényelnek járulékos aritmetikai műveleteket a legtöbb konverzióhoz.
Nagy sűrűségű kódolás
[szerkesztés]Ha egy decimális számjegyhez 4 bit szükséges, akkor három decimális jegyhez 12 bit kell. Mivel 210>103, akkor 3 decimális jegy együttes konverziója csak 10 bitet igényel. A Chen-Ho kódolás és a Densely tömörített decimális ilyen típusú kódolás. Nagy előnye, hogy két számjegy esetében optimális módon 7 bitet, míg 1 számjegy esetén 4 bitet használ, mint a szabályos BCD.
Az IBM és a BCD
[szerkesztés]Az IBM használta a binárisan kódolt decimális és a BCD kifejezést egy hat bites úgynevezett alfamerikus kódra, amely a számokat, a nagybetűket és speciális karaktereket kezelt. Az IBM korai gépeiben a BCD néhány variánsát használta, mint az IBM 1620, IBM 1400 series és az IBM 700/7000 sorozatának nem-decimális architektúrájú tagjai. Az IBM System/360, sorozat megjelenésekor tért át az IBM BCD a 8 bites EBCDIC-re.
Ennél a BCD formánál a biteket az B, A, 8, 4, 2 és 1 címkékkel látták el. Számok kódolása esetében B és A nulla értékű. Az A betű kódja (B,A,1).
Az 1620 BCD alfamerik esetében számpárokat használtak, a páratlan jegyeket a "zóna – zone" esetében, és páros jegyeket a "számjegy-digit" esetében. A ki/bevitel esetén a hardver konvertálta a belső jegyeket a külső, szabályos hat-bites BCD kódra, és vissza.
A decimális architektúrájú IBM 7070, IBM 7072, és IBM 7074 alfamerik kódolásnál a számpárokat használták (a kettő-az-ötből kódot használtak, és nem BCD-t) a 10-jegyes szavakhoz, a "zona" a bal jegyeket, a "számjegy" pedig a jobb jegyeket jelentette. A ki/beviteli konverziókat szintén hardver végezte.
BCD összeadás
[szerkesztés]A BCD számokkal végzett összeadás első lépése a BCD kódban ábrázolt számok bináris összeadása, majd az eredménytől függően korrekcióra lehet szükség, hogy a helyes eredményt megkapjuk: A korrekció során minden olyan csoportra, ahol az összeadás után az eredmény nagyobb, mint 9, hozzá kell még adni az eredményhez 6-ot. Le kell vonni ugyanis 10-et és a következő csoportot eggyel növelni kell (16 hozzáadása), így összességében 6-tal kell növelni a számot. Például:
- 9+6=15: [1001] + [0110] = [1111] binárisan.
Binárisan az eredmény nem lehet nagyobb, mint 9 (nibble-nként), ezért korrekcióként a csoporthoz hozzá kell adni még 6-ot:
- 15+6: [0000 1111] + [0000 0110] = [0001 0101]
ami eredményül már két nibble-t ad, [0001]-et és [0101] ami pontosan az "1" és "5" megfelelője. Így a BCD összeadás a helyes eredményt adja.
Teljes bájtnyi BCD számok összeadásakor azonban nem elegendő információ a 9-cel való összehasonlítás:
- 49+38=87: [0100 1001] + [0011 1000] = [10000001] binárisan.
Mivel az eredmény érvényes BCD kód: [1000 0001]=81, azt hihetnénk, hogy jó eredményt kaptunk. A probléma az, hogy történt egy átvitel (összeadási maradék) a hátsó csoportból az első felé, ami azonban bináris összeadásnál 16-os értéket képvisel, BCD-ként való értelmezésben pedig csak 10-et. A helyes eredményhez újból 6-tal kell növelni az eredményt (81+6=87). Hogy volt-e ilyen átvitel, azt a processzorok (például az Intel 8085) a „half carry” jelzőbit beállításával jelzi. A korrekciót elvégző assembly parancs a DAA (decimal adjust after addition).
Lásd még Douglas Jones' Tutorial.
Háttér
[szerkesztés]A következő táblázatban a legismertebb BCD kódolási formákat ábrázoljuk, a teljesség igénye nélkül. A BCD 8421-re gyakran hivatkoznak, mint egyszerű binárisan kódolt decimális – Simple Binary-Coded Decimal (SBCD) vagy BCD 8421. Használják még a NBCD rövidítést is, ami a Natural Binary-Coded Decimal – természetes binárisan kódolt decimális rövidítése.
A táblázat fejlécében a '8 4 2 1' mutatja a bitek súlyait; meg kell jegyezni, hogy az 5. oszlopban két súly negatív.
A következő táblázat a decimális 0 és 9 közé eső számokat ábrázolja a különböző BCD rendszerekben:
Számjegy | BCD 8 4 2 1 |
Excess-3 vagy Stibitz kód |
BCD 2 4 2 1 vagy Aiken kód |
BCD 8 4 −2 −1 |
IBM 702 IBM 705 IBM 7080 IBM 1401 8 4 2 1 |
---|---|---|---|---|---|
0 | 0000 | 0011 | 0000 | 0000 | 1010 |
1 | 0001 | 0100 | 0001 | 0111 | 0001 |
2 | 0010 | 0101 | 0010 | 0110 | 0010 |
3 | 0011 | 0110 | 0011 | 0101 | 0011 |
4 | 0100 | 0111 | 0100 | 0100 | 0100 |
5 | 0101 | 1000 | 1011 | 1011 | 0101 |
6 | 0110 | 1001 | 1100 | 1010 | 0110 |
7 | 0111 | 1010 | 1101 | 1001 | 0111 |
8 | 1000 | 1011 | 1110 | 1000 | 1000 |
9 | 1001 | 1100 | 1111 | 1111 | 1001 |
Jogi vonatkozása
[szerkesztés]1972-ben az USA Legfelső Bírósága felülbírálta egy alsóbb fokú bíróság döntését, amelyik megengedte BCD kódolású számok egy számítógépre történő bináris konverziójának szabadalmaztatását. (lásd: Gottschalk v Benson). Ez egy nagyon fontos eset volt egy szoftver vagy algoritmus szabadalmaztathatóságának meghatározásánál.
A tiszta binárissal való összehasonlítás
[szerkesztés]Előnyei
[szerkesztés]- A 10-zel vagy 10 hatványaival történő szorzás egyszerű, a tizedesek és egészek kezelése lényegében megegyezik a megszokottal.
- Kerekítés egyszerűen végrehajtható.
- A karakter formátumra való konverzió vagy megjelenítés (u.m. szöveg alapú formátumok, mint például XML, vagy 7 szegmens kijelző meghajtása megjelenítésnél) sokkal egyszerűbb, mint mint tiszta bináris tárolás esetében.
Hátrányai
[szerkesztés]- Több aritmetikai művelet megvalósítása bonyolultabb, mint a tiszta bináris esetében. Az összeadók esetében külön logika kell az átvitelek vizsgálatához és kezeléséhez. Hozzávetőlegesen 15-20%-kal több áramkört igényel a tiszta binárissal összehasonlítva. A szorzási algoritmus sokkal komplexebb, mint a tiszta binárisnál használt léptetés-maszkolás-összeadás (egy bináris szorzáshoz léptető és összeadó egységek szükségesek, számjegyenként vagy számjegy csoportonként).
Kapcsolódó szócikkek
[szerkesztés]Egyéb, külső hivatkozások
[szerkesztés]További információk
[szerkesztés]- https://web.archive.org/web/20061214014211/http://www.danbbs.dk/~erikoest/bcd.htm
- Schmid, Hermann, Decimal computation. New York, Wiley, 1974
- Decimal Arithmetic Bibliography
- Fundamentals of Digital Logic by Brown and Vranesic, 2003