„Bináris számábrázolás” változatai közötti eltérés
(Váz + kategória) |
|||
(2 közbenső módosítás ugyanattól a szerkesztőtől nincs mutatva) | |||
20. sor: | 20. sor: | ||
=== Tizenhatos számrendszer === | === Tizenhatos számrendszer === | ||
+ | |||
+ | A sok-sok egymás után írt '110100100101' bináris értékek emberi szem számára nehezen olvashatók a túl sok jel miatt. Így helyette gondolatban 4 bitenként csoportosítjuk a biteket. Ezáltal az előző számsor '1101 0010 0101'-ként látható. Az elemi 4 bites csoportok pedig 0..15 közé eső értékkel írhatók le, amit a gyakorlatban a jól bevált 0..9 számjegyekkel, majd a..f betükkel írunk le. Ezáltal a példában ismertetett számsor értékei: 13, 2, 5, amit egyszerűen d25. Gyakran előfordul, hogy 0..9 közé esik minden számjegye, ami által önmagában nem látjuk belőle, hogy tizes vagy 16-os számrendszerként értelmezendő számmal van-e dolgunk. Ennek feloldása érdekében eléírunk egy számrendszert jelölő betűt vagy betűpárost. | ||
+ | |||
+ | * 2-es (= bináris, bin) számrendszer esetén a 0b előtag, például 0b110100100101 vagy 0b.1101.0010.0101 írásforma a szokásos | ||
+ | * tízenhatos (= hexadecimális, hex) számrendszer esetén a 0x előtag, például 0xd25 vagy 0x0d25 ill. 0x00000d25 utóbbiakkal jelezve hogy 16 ill. 32 bites busz fogja szállítani a számot. | ||
+ | * tízes (= decimális, dec) számrendszer esetén: semmi, ahogy a 'hétköznapi' életben megszoktuk. | ||
=== Tízes számrendszer === | === Tízes számrendszer === | ||
+ | Kettő lehetséges módszer terjedt el: | ||
+ | |||
+ | * BCD ábrázolás, ahol a 4 bitenként csoportosított bináris jel csak 0..9 (0b0000..0b1001) közötti értéket vehet fel, és például ha 7+5 összeadást végezzük el (0b0111 + 0b0101 = 0b1100), akkor rögvest kivonunk a kapott értékből 10-et (0b1100-0b1010) és a maradék lesz az utolsó helyiérték, a magasabb pedig 1-gyel növekszik. Azaz 0x12 értéket vesz fel. De kijelzőre íráskor egyszerűen '12'-t írunk, hiszen bináris jelként 4 bitenként csoportosítva a a tízes számrendszerbeli digiteket ábrázoltuk a számolások során 0..9 értékek között. | ||
+ | * binárissá alakítani (a 4 bitenként csoportosított bitek 0..9 és a..f értékkészletet egyaránt felvehetik), binárisan elvégezni a számítást, adat továbbítását, stb, a megjelenítéskor pedig visszaalakítani tízes számrendszerbe. Előnye: egyszerűbb a processzornak vele számolni, azonban tízes->bináris konverzió és a bináris->tízes konverzió nehézkes. | ||
+ | |||
+ | ;Konverzió tízes - tizenhatos: | ||
+ | |||
+ | Például konvertáljuk a 345 értéket 16-os számrendszerbe: | ||
+ | |||
+ | :érték = (('3' * 10 + '4') * 10) + '5' | ||
+ | :érték = ((0b0011 * 0b1010 + 0b0101) * 0b1010) + 0b0101 = 0b.0001.0101.1001 (= 0x159) | ||
+ | |||
+ | ;Konverzió tizenhatos - tízes: | ||
+ | |||
+ | :Kiindulás például a fenti, 0b.0001.0101.1001 = 0x159 érték átalakítása: | ||
+ | :Osszuk el 10-zel a 0x159-et: 0b.0001.0101.1001 / 0b1010 = 0b.0010.0010 (= 0x22) | ||
+ | ::Szorozzuk vissza 10-zel (0b1010) és a kapott eredményt vonjuk ki a 0x159-ből. A maradék az utolsó számjegy. | ||
+ | :Osszuk el 10-zel a 0x22-őt: 0b.0010.0010 / 0b1010 = 0b.0011 | ||
+ | ::Szorozzuk vissza 10-zel (0b1010) és a kapott eredményt vonjuk ki a 0x22-ből. A maradék az utolsó előtti számjegy. | ||
+ | :Osztás itt már nem kell, mert az eredmény 10 alatti, azaz megvan a legfelsőbb számjegy, ami a 3. | ||
+ | |||
+ | Mint látszik, ez a konverzió nehézkes, ezért egyszerűbb számításoknál BCD aritmetikát használnak inkább a binárissá konvertálás - bináris aritmetika - decimálissá konvertálás helyett. Bonyolultabb számítások esetén azonban a konvertálás és a bináris számokkal való számolás a hatékonyabb. | ||
== Egyszerű műveletek bináris jelekkel == | == Egyszerű műveletek bináris jelekkel == | ||
28. sor: | 56. sor: | ||
=== Jelenként végzett logikai alapműveletek === | === Jelenként végzett logikai alapműveletek === | ||
− | Lásd: [[Logikai alapműveletek]] | + | NOT, AND, OR, XOR, ... Lásd: [[Logikai alapműveletek]] |
=== Kettes komplemens képzés === | === Kettes komplemens képzés === | ||
+ | |||
+ | Negatív számok bináris ábrázolásánál szükséges. Lényege: legfelső bit a helyiértékének megfelelő súllyal, ám negatív irányban van értelmezve. Például 8 bites érték esetén a legfelső bit nem 128-at ér, hanem -128-at. Így az ábrázolható értéktartomány 0..255 helyett -128..+127 között értelmezendő. | ||
+ | |||
+ | 0...127 (0x00..0x7f) között semmi különbség nincs az előjel nélküli ábrázolás és az előjeles között. Azonban a -1 érték a 0xff és a -128 érték a 0x80. Erre az aritmetikai műveleteknél tekintettel kell lenni, ahogy arra is, hogy a legfelső bitre semmiképp nem csordulhat rá alatta levő bitről érték - mivel ez a bit máshogy lesz ebben az esetben értelmezve. | ||
=== Összeadás === | === Összeadás === | ||
+ | |||
+ | * Bináris 0+0 = 0 | ||
+ | * Bináris 0+1 vagy 1+0 = 1 | ||
+ | * Bináris 1+1 = 0 és lesz egy átvitel a magasabb helyiértékre. | ||
+ | |||
+ | A fenti annyival bonyolódik, hogy az alsóbb helyiértékről származó átvitelt is adott esetben még hozzá kell adni. | ||
+ | |||
+ | Például: 5+7 = 12 | ||
+ | 0b0101 | ||
+ | +0b0111 | ||
+ | --------------------- alább lépésenként, ahogy általános iskolában tanultuk | ||
+ | 0 átvitel van | ||
+ | 00 átvitel van | ||
+ | 100 átvitel van | ||
+ | 0b1100 nincs átvitel | ||
=== Kivonás === | === Kivonás === | ||
+ | |||
+ | Például: 7-5 = 2 | ||
+ | 0b0111 | ||
+ | -0b0101 | ||
+ | --------------------- alább lépésenként, ahogy általános iskolában tanultuk | ||
+ | 0 nincs átvitel | ||
+ | 10 nincs átvitel | ||
+ | 010 nincs átvitel | ||
+ | 0b0100 | ||
+ | |||
+ | Például: 5-7 = -2 | ||
+ | 0b0101 | ||
+ | +0b0111 | ||
+ | --------------------- alább lépésenként, ahogy általános iskolában tanultuk | ||
+ | 0 nincs átvitel | ||
+ | 10 átvitel van | ||
+ | 110 átvitel van | ||
+ | 0b1110 és tényleg --> 6-8 = -2 | ||
=== Szorzás === | === Szorzás === | ||
+ | |||
+ | Például: 5*7 = 35 | ||
+ | 0b0101 * 0b0111 | ||
+ | ---------- | ||
+ | 0101 | ||
+ | 0101 | ||
+ | 0101 | ||
+ | 0000 | ||
+ | ---------- | ||
+ | 0b00100011 = 0x23 = 35 | ||
=== Osztás === | === Osztás === | ||
+ | |||
+ | Például: 35/7 = 5 | ||
+ | 0b00100011 : 0b0111 | ||
+ | ---------- | ||
+ | 0 : 0 | ||
+ | 00 : 0 | ||
+ | 001 : 0 | ||
+ | 0010 : 0 | ||
+ | 00100 : 0 | ||
+ | 001000 : 1 0b1000 - 0b0111 = 0b0001 | ||
+ | 000001 | ||
+ | 0000011 : 0 | ||
+ | 00000111 : 1 0b0111 - 0b0111 = 0 (nincs maradék sem - ami törtként tovább lenne osztható) | ||
+ | --------------- | ||
+ | a jobboldali függőleges ki is adja az 5-öt, ami az eredmény | ||
== Lebegőpontos számábrázolás == | == Lebegőpontos számábrázolás == | ||
+ | |||
+ | Az előző részben ismertetett megoldással egész és tört számokat is lehet ábrázolni. Elég ha arra gondulunk, hogy 32 bites bináris számból | ||
+ | * 24 bitet tartunk fel egész értékek számára, 0..16 millió közti értékek kifejezésére (vagy ±8 millió) | ||
+ | * 8 bitet pedig 0,004 pontosságú törtrész számára. | ||
+ | |||
+ | Jó lenne, ha például 65000 alatti értékek esetén 0,000015 finomsággal tudnánk törtet ábrázolni. Azaz a törtrész pontosságát a szám nagyságának függvényében hanyagolni illetve finomítani lehetne. Erre megoldás a lebegőpontos számábrázolás. | ||
+ | |||
+ | ;Hogyan néz ki a lebegőpontos szám?: | ||
+ | Képzeljük el, hogy | ||
+ | * egy 1,0000 és 1,99999 közötti pontos értéket ábrázolunk, ezt nevezzük '''mantisszá'''nak. | ||
+ | * és a fenti értéket 2<sup>±valahányadikon</sup> hatvánnyal szorzunk, ezt nevezzük '''exponens'''nek. | ||
+ | |||
+ | Például 32 bites számhossz esetén | ||
+ | |||
+ | * 24 bitet használjunk fel '''mantisszá'''nak, azaz (1,)0100.0110.101 (azaz 23 bitnyi tört - amely a pontosságot adja) | ||
+ | * 8 bitet pedig '''exponens'''nek, azaz 2<sup>-128</sup>..2<sup>127</sup> nagyságrend ábrázolásig | ||
+ | |||
+ | Az 1, azért van zárójelben, hiszen ennek ábrázolása szükségtelen, mivel a mantissza minden esetben 1,000...1,999 érték közötti értéket vesz fel - így a számításokkor ez fixen bináris '1' értékű, és azt a tényt, hogy nagyon-nagyon kicsi vagy nagyon-nagyon nagy, azt az exponens határozza meg. A mantissza legfelső bitje ezért felesleges. Azonban felhasználható előjelhez a kettes komplemens számábrázolás szabályai alapján. | ||
== Magasabbrendű műveletek == | == Magasabbrendű műveletek == |
A lap jelenlegi, 2010. július 28., 13:31-kori változata
Tartalomjegyzék
A bináris jel
A bináris szám elemi értéke kétféle lehet: 0 vagy 1. Vezetéken nézve logikai jelszintről beszélünk, amelynek értéke L (low) vagy H (high) logikai érték.
A jelszintek feszültségtartománya attól függ, milyen logikáról beszélünk.
- TTL logika esetén 0,8 V alatt L szint, 2 V felett H szint. Közte határozatlan.
- CMOS esetén a tápfeszültség 1/3-a alatt L, a 2/3-a felett H szint. Közte határozatlan.
Több bináris jel és értelmezése
Ahogy a tízes számrendszerben megszokott, hogy több helyiértéket írunk egymás mögé, ugyanúgy vezethetünk többet is a fent ismertetett kétállapotú jelvezetékekből. Ekkor adatbuszról beszélünk. A leg alapvetőbb két feltétel akár tízes, akár kettes számrendszerről legyen is szó:
- ne keverjük össze a helyiértékeket, vezeték esetén a logikai jeleket szállító vezetékek sorrendjét
- nem mindegy, hogy jobbról balra, vagy balról jobbra olvassuk a számjegyeket, a többvezetékes buszon nevezzük a felső helyiértéket MSB-nek (most significant bit), a legalsó helyiértéket LSB-nek (least significant bit).
Az így kapott N bit széles buszon összesen 2N féle állapot, azaz ennyi érték ábrázolható. Például 8 bit esetén 28 = 256 (0..255 vagy kettes komplemens ábrázolásnál -128 .. +127), míg 12 bit esetén 212 = 4096 (0..4095 vagy kettes komolemens ábrázolásnál -2048..+2047) egész érték jeleníthető meg. És így tovább.
Konverzió más számrendszerre
Tizenhatos számrendszer
A sok-sok egymás után írt '110100100101' bináris értékek emberi szem számára nehezen olvashatók a túl sok jel miatt. Így helyette gondolatban 4 bitenként csoportosítjuk a biteket. Ezáltal az előző számsor '1101 0010 0101'-ként látható. Az elemi 4 bites csoportok pedig 0..15 közé eső értékkel írhatók le, amit a gyakorlatban a jól bevált 0..9 számjegyekkel, majd a..f betükkel írunk le. Ezáltal a példában ismertetett számsor értékei: 13, 2, 5, amit egyszerűen d25. Gyakran előfordul, hogy 0..9 közé esik minden számjegye, ami által önmagában nem látjuk belőle, hogy tizes vagy 16-os számrendszerként értelmezendő számmal van-e dolgunk. Ennek feloldása érdekében eléírunk egy számrendszert jelölő betűt vagy betűpárost.
- 2-es (= bináris, bin) számrendszer esetén a 0b előtag, például 0b110100100101 vagy 0b.1101.0010.0101 írásforma a szokásos
- tízenhatos (= hexadecimális, hex) számrendszer esetén a 0x előtag, például 0xd25 vagy 0x0d25 ill. 0x00000d25 utóbbiakkal jelezve hogy 16 ill. 32 bites busz fogja szállítani a számot.
- tízes (= decimális, dec) számrendszer esetén: semmi, ahogy a 'hétköznapi' életben megszoktuk.
Tízes számrendszer
Kettő lehetséges módszer terjedt el:
- BCD ábrázolás, ahol a 4 bitenként csoportosított bináris jel csak 0..9 (0b0000..0b1001) közötti értéket vehet fel, és például ha 7+5 összeadást végezzük el (0b0111 + 0b0101 = 0b1100), akkor rögvest kivonunk a kapott értékből 10-et (0b1100-0b1010) és a maradék lesz az utolsó helyiérték, a magasabb pedig 1-gyel növekszik. Azaz 0x12 értéket vesz fel. De kijelzőre íráskor egyszerűen '12'-t írunk, hiszen bináris jelként 4 bitenként csoportosítva a a tízes számrendszerbeli digiteket ábrázoltuk a számolások során 0..9 értékek között.
- binárissá alakítani (a 4 bitenként csoportosított bitek 0..9 és a..f értékkészletet egyaránt felvehetik), binárisan elvégezni a számítást, adat továbbítását, stb, a megjelenítéskor pedig visszaalakítani tízes számrendszerbe. Előnye: egyszerűbb a processzornak vele számolni, azonban tízes->bináris konverzió és a bináris->tízes konverzió nehézkes.
- Konverzió tízes - tizenhatos
Például konvertáljuk a 345 értéket 16-os számrendszerbe:
- érték = (('3' * 10 + '4') * 10) + '5'
- érték = ((0b0011 * 0b1010 + 0b0101) * 0b1010) + 0b0101 = 0b.0001.0101.1001 (= 0x159)
- Konverzió tizenhatos - tízes
- Kiindulás például a fenti, 0b.0001.0101.1001 = 0x159 érték átalakítása:
- Osszuk el 10-zel a 0x159-et: 0b.0001.0101.1001 / 0b1010 = 0b.0010.0010 (= 0x22)
- Szorozzuk vissza 10-zel (0b1010) és a kapott eredményt vonjuk ki a 0x159-ből. A maradék az utolsó számjegy.
- Osszuk el 10-zel a 0x22-őt: 0b.0010.0010 / 0b1010 = 0b.0011
- Szorozzuk vissza 10-zel (0b1010) és a kapott eredményt vonjuk ki a 0x22-ből. A maradék az utolsó előtti számjegy.
- Osztás itt már nem kell, mert az eredmény 10 alatti, azaz megvan a legfelsőbb számjegy, ami a 3.
Mint látszik, ez a konverzió nehézkes, ezért egyszerűbb számításoknál BCD aritmetikát használnak inkább a binárissá konvertálás - bináris aritmetika - decimálissá konvertálás helyett. Bonyolultabb számítások esetén azonban a konvertálás és a bináris számokkal való számolás a hatékonyabb.
Egyszerű műveletek bináris jelekkel
Jelenként végzett logikai alapműveletek
NOT, AND, OR, XOR, ... Lásd: Logikai alapműveletek
Kettes komplemens képzés
Negatív számok bináris ábrázolásánál szükséges. Lényege: legfelső bit a helyiértékének megfelelő súllyal, ám negatív irányban van értelmezve. Például 8 bites érték esetén a legfelső bit nem 128-at ér, hanem -128-at. Így az ábrázolható értéktartomány 0..255 helyett -128..+127 között értelmezendő.
0...127 (0x00..0x7f) között semmi különbség nincs az előjel nélküli ábrázolás és az előjeles között. Azonban a -1 érték a 0xff és a -128 érték a 0x80. Erre az aritmetikai műveleteknél tekintettel kell lenni, ahogy arra is, hogy a legfelső bitre semmiképp nem csordulhat rá alatta levő bitről érték - mivel ez a bit máshogy lesz ebben az esetben értelmezve.
Összeadás
- Bináris 0+0 = 0
- Bináris 0+1 vagy 1+0 = 1
- Bináris 1+1 = 0 és lesz egy átvitel a magasabb helyiértékre.
A fenti annyival bonyolódik, hogy az alsóbb helyiértékről származó átvitelt is adott esetben még hozzá kell adni.
Például: 5+7 = 12
0b0101 +0b0111 --------------------- alább lépésenként, ahogy általános iskolában tanultuk 0 átvitel van 00 átvitel van 100 átvitel van 0b1100 nincs átvitel
Kivonás
Például: 7-5 = 2
0b0111 -0b0101 --------------------- alább lépésenként, ahogy általános iskolában tanultuk 0 nincs átvitel 10 nincs átvitel 010 nincs átvitel 0b0100
Például: 5-7 = -2
0b0101 +0b0111 --------------------- alább lépésenként, ahogy általános iskolában tanultuk 0 nincs átvitel 10 átvitel van 110 átvitel van 0b1110 és tényleg --> 6-8 = -2
Szorzás
Például: 5*7 = 35
0b0101 * 0b0111 ---------- 0101 0101 0101 0000 ---------- 0b00100011 = 0x23 = 35
Osztás
Például: 35/7 = 5
0b00100011 : 0b0111 ---------- 0 : 0 00 : 0 001 : 0 0010 : 0 00100 : 0 001000 : 1 0b1000 - 0b0111 = 0b0001 000001 0000011 : 0 00000111 : 1 0b0111 - 0b0111 = 0 (nincs maradék sem - ami törtként tovább lenne osztható) --------------- a jobboldali függőleges ki is adja az 5-öt, ami az eredmény
Lebegőpontos számábrázolás
Az előző részben ismertetett megoldással egész és tört számokat is lehet ábrázolni. Elég ha arra gondulunk, hogy 32 bites bináris számból
- 24 bitet tartunk fel egész értékek számára, 0..16 millió közti értékek kifejezésére (vagy ±8 millió)
- 8 bitet pedig 0,004 pontosságú törtrész számára.
Jó lenne, ha például 65000 alatti értékek esetén 0,000015 finomsággal tudnánk törtet ábrázolni. Azaz a törtrész pontosságát a szám nagyságának függvényében hanyagolni illetve finomítani lehetne. Erre megoldás a lebegőpontos számábrázolás.
- Hogyan néz ki a lebegőpontos szám?
Képzeljük el, hogy
- egy 1,0000 és 1,99999 közötti pontos értéket ábrázolunk, ezt nevezzük mantisszának.
- és a fenti értéket 2±valahányadikon hatvánnyal szorzunk, ezt nevezzük exponensnek.
Például 32 bites számhossz esetén
- 24 bitet használjunk fel mantisszának, azaz (1,)0100.0110.101 (azaz 23 bitnyi tört - amely a pontosságot adja)
- 8 bitet pedig exponensnek, azaz 2-128..2127 nagyságrend ábrázolásig
Az 1, azért van zárójelben, hiszen ennek ábrázolása szükségtelen, mivel a mantissza minden esetben 1,000...1,999 érték közötti értéket vesz fel - így a számításokkor ez fixen bináris '1' értékű, és azt a tényt, hogy nagyon-nagyon kicsi vagy nagyon-nagyon nagy, azt az exponens határozza meg. A mantissza legfelső bitje ezért felesleges. Azonban felhasználható előjelhez a kettes komplemens számábrázolás szabályai alapján.
Magasabbrendű műveletek
Sok függvény vagy eljárás kiszámítását nem lehet egy-egy egzakt osztással meghatározni. Azonban ezeknek a függvényeknek a pontos értékei fokozatosan közelíthetők a Taylor-soraikkal. Mielőtt nagyon furcsa szemekkel néznénk erre a tudományra, a Taylor-sor napjainkban már középiskolai tananyag, azonban összetettsége túlmutat a rádióamatőr témákon. Akit bővebben érdekel, itt olvashat róla és néhány alapvető függvény kiszámításáról.
Ami a lényeges számunkra:
- sin(x)
- cos(x) ---> tan(x) = sin(x)/cos(x)
- arctg(x). Érdekessége az arkusztangensnek, hogy arctg(1) éppen a π/4. Ez az egyik módszer a π közelítő kiszámításának.
- ln(x) ---> természetes logaritmus. Ha log(), azaz tízes alapú logaritmus kell, akkor ez így számolható: log(x) = ln(x)/ln(10)
- ex --> ha ab érték kell, ebből kiszámítható: [math]a^b = e^{ln(a) \cdot b}[/math]
- N. gyökvonás és N. hatvány: Hatványról volt szó. Gyökvonás ugyanígy zajlik, azonban az alap logaritmusát nem szorozzuk a kitevővel, hanem osztjuk. Azaz [math]\sqrt[b]{a} = e^{\frac{ln(a)}{b}}[/math]