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ésEgy 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ésA 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ésSzé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ális, 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ésHa 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 szorosan pakolt decimális (densely packed decimal, DPD) 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ésAz IBM használta a binárisan kódolt decimális és a BCD kifejezést egy hat bites úgynevezett alfanumerikus 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 (erre „BCDIC alphamerics” néven is hivatkoztak), 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 alfanumerikus 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 alfanumerikus 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ésA 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ésA 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). 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és1972-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ésElő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 (például szöveg alapú formátumoknál, mint az XML, vagy 7 szegmenses kijelzők vezérlésekor) sokkal egyszerűbb, mint a 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ésEgyéb, külső hivatkozások
szerkesztésTová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