Binárisan kódolt decimális

A Wikipédiából, a szabad enciklopédiából

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 | forrásszöveg szerkesztése]

Ez a bináris óra BCD-kódban mutatja az időt.

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.)

BCD az elektronikában[szerkesztés | forrásszöveg szerkesztése]

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 | forrásszöveg szerkesztése]

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űkeleteket a legtöbb konverzióhoz.

Nagy sűrűségű kódolás[szerkesztés | forrásszöveg szerkesztése]

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 | forrásszöveg szerkesztése]

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).

A 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 | forrásszöveg szerkesztése]

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 | forrásszöveg szerkesztése]

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 | forrásszöveg szerkesztése]

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 | forrásszöveg szerkesztése]

Előnyei[szerkesztés | forrásszöveg szerkesztése]

  • 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 | forrásszöveg szerkesztése]

  • 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 | forrásszöveg szerkesztése]

Egyéb, külső hivatkozások[szerkesztés | forrásszöveg szerkesztése]

Egyéb információk, referenciák[szerkesztés | forrásszöveg szerkesztése]