Signaalinkäsittelytekniikan laboratorio
Digitaalitekniikan perusteet

Luennot
 Sivukartta  
Sanasto
Laskuharjoitukset

Binäärijärjestelmän komplementeista

Yleisesti missä tahansa lukujärjestelmässä (kantaluku r), on kaksi erityyppistä komplementtia: kantaluvun komplementti (radix complement) ja kantaluvun heikennetty komplementti (diminished radix complement). Näistä edellistä kutsutaan r:n (eli kantaluvun) komplementiksi ja jälkimmäistä (r -1 ):n komplementiksi. Nämä komplementit binäärijärjestelmän tapauksessa ovat siis 2:n komplementti ja 1:n komplementti, sillä binäärijärjestelmän kantalukuhan on 2.

Komplementtia tarvitaan digitaalijärjestelmissä kuvaamaan negatiivisia ja positiivisia lukuja. Komplementointi on eräänlaista lukualueen peilaamista tietyn peilauskohdan suhteen. Kyseessä on taas sopimus: on sovittu, että tiettyä rajapyykkiä itseisarvoltaan suuremmat binäärisarjat tulkitaan negatiivisina ja tätä samaa rajapyykkiä pienemmät positiivisina. Rajapyykki sijoitetaan mahdollisimman tarkasti lukualueen puoliväliin. Käytäntö on, että jos komplementtiluvun eniten merkitsevä bitti on 0, luku on positiivinen. Jos komplementtiluvun eniten merkitsevä bitti on 1, on luku negatiivinen.

Jos luku on positiivinen, se tulkitaan normaalisti sijoittamalla lausekkeeseen tarvittavat kakkosen kantaluvut, kuten on aiemminkin jo tehty.

(Esim 0101 = 1 × 2 2 + 1 × 2 0 = 4 + 1 = 5).

Jos luku on negatiivinen, täytyy tehdä peilausoperaatio. Peilauksessa (riippuen komplementin tyypistä) suhteutetaan loput bittisarjan bitit ensimmäiseen lukuun.

Esimerkiksi luku 10101. Eniten merkitsevä bitti on 1, joten luvun muut bitit peilataan sen suhteen. 2-komplementin tapauksessa peilaus tapahtuu näin: 10101 = -16 + 4 + 1 = -11.

(Jos komplementin idea ei heti aukea, ei kannata masentua. Normaalielämässä riittää pitkälle, jos muistaa, että komplementointi tarkoittaa lukualueen peilausta. Digitaalisuunnittelussa työkalut yleensä huolehtivat komplementoinnista. Siihen törmätään vain erityisen haastavissa tapauksissa tai ongelmatilanteissa. Tentissä tosin asiaa kysytään usein jonkin verran.)

1-komplementti

Olkoon B positiivinen kokonaisluku, jonka suuruusosan esityspituus on n bittiä. Tällöin B:n 1:n komplementti on

C1,n (B) = 2n - 1 - B

1-komplementin muuntaminen desimaalimuotoon kannattaa tehdä siten, että muunnetaan luku ensin 2-komplementtiin. Komplementtien välillä vallitsee yhteys:

C2,n(B) = C1,n(B) + 1

2-komplementti

Olkoon B positiivinen kokonaisluku, jonka suuruusosan esityspituus on n bittiä. Tällöin B:n 2:n komplementti on

C2,n(B) = 2n - B

Käytännössä helppona nyrkkisääntönä voidaan muistaa seuraavaa: Jos luku on positiivinen, se tulkitaan normaalisti. Tällöin muunnos 10-järjestelmään tapahtuu aivan samalla tavalla kuin on aiemmin esitetty.

Jos luku on negatiivinen, tulkitaan luvun eniten merkitsevä bitti (merkkibitti) aivan kuin se olisi tavallinen kerroin, mutta negatiivisena. Tämän jälkeen tulkitaan muut kertoimet positiivisina.

Esimerkki 1

Luku 1001102 (luku on siis 2-komplementtimuodossa, merkkibitti on 1 eli luku on negatiivinen) tulkitaan seuraavasti:

1001102 = -1 × 25 + 1 × 22 + 1 × 21 = -3210 + 410 + 210 = -2610

Esimerkki 2

Luku 1011012 (luku on siis 2-komplementtimuodossa, merkkibitti on 1 eli luku on negatiivinen) tulkitaan seuraavasti:

1011012 = -1 × 25 + 1 × 23 + 1 × 22 + 1 × 20 = -3210 + 810 + 410 + 110= -1910

Esimerkki 3

Luku 0110012 (luku on siis 2-komplementtimuodossa, merkkibitti on 0 eli luku on positiivinen) tulkitaan seuraavasti:

0110012 = 1 × 24 + 1 × 23 + 1 × 20 = 1610 + 810 + 110 = 2510

Binääriluvun komplementin muodostaminen
1-komplementti on helppo muodostaa:

Kaavaa ( C1,n (B) = 2n - 1 - B ) tulkittaessa huomataan, että 1-komplementin luvusta saa suoraan kääntämällä kaikki bitit nurin (eli ykkösestä tulee nolla, nollasta ykkönen). Jos luku on lyhyempi kuin käytetty bittien määrä, lisätään alkuun lisää nollia ja käännetään ne muunnoksessa ykkösiksi. Eli esim. jos on valittu 4 bittinen esitys tapa ja käsiteltävä luku on 510 = 1012. Nyt pitää lisätä yksi nolla luvun alkuun jolloin luvuksi tulee 01012

HUOM ! Mikäli luku on aluksi itseisarvo-etumerkki muodossa, jätetään etumerkki rauhaan. Siis etumerkkiä ei käännetä edellisen ohjeen mukaisesti vaan se pysyy samana.

Esimerkki 1
Suuruusosan esityspituus 7 bittiä, luku B=11001 (=2510)
  • Lisätään tarvittavat nollat: B=0011001
  • Käännetään bitit: C1,7(B) = 1100110, mikä on haluttu tulos
Tuloksen voi tarkistaa muuntamalla sen edelleen 2-komplementiksi ja sitä kautta kymmenjärjestelmään:

2-komplementiksi eli lisätään 1: C2,7(B)=1100111=
Muuntaminen 2-komplementista 10-järjestelmään tehdään kuten on esitetty edellä:

C2,7(B)=1100111= -26 + 25 + 22 + 21 + 20 = -2510

Esimerkki 2
0110011 Suuruusosan esityspituus 7 bittiä, luku B=1001101 (=7710)
  • Nyt ei tarvitse lisätä numeroita luvun eteen, sillä sen pituus on jo 7 bittiä.
  • Käännetään bitit: C1,7(B) = 0110010, mikä on haluttu tulos
Tuloksen voi tarkistaa muuntamalla sen edelleen 2-komplementiksi ja sitä kautta kymmenjärjestelmään:

2-komplementiksi eli lisätään 1: C2,7(B)=0110011.

HUOM ! Tämä vaikuttaisi olevan positiivinen luku, mutta sehän ei voi olla sitä, koska
edellä suoritimme komplementtia muodostaessamme peilauksen. Tämän takia tulee nyt lisätä yksi ykkönen koko luvun eteen, jotta tulos olis negatiivinen kuten pitääkin.

C2,7(B)=10110011= -27 + 25 + 24 + 21 + 20= -7710

Esimerkki 3
Suuruusosan esityspituus 7 bittiä, luku (itseisarvo-etumerkki muodossa) B=10011010 (=-2610). Ensimmäinen bitti kertoo etumerkin (1 = -)ja sitten tulee luvun suuruusosa (7 bittiä).
  • Nyt ei kosketa lainkaan etumerkkiin. Lisäksi huomataan, että suuruusosa on jo 7 bittiä pitkä, joten ei tarvetta toimenpiteisiin.
  • Käännetään bitit: C1,7(B) = 11100101, mikä on haluttu tulos
Tuloksen voi tarkistaa muuntamalla sen edelleen 2-komplementiksi ja sitä kautta kymmenjärjestelmään:

2-komplementiksi eli lisätään 1: C2,7(B)=11100110= -27 + 26 + + 25 + 22 + 21 = -2610

Esimerkki 4
Suuruusosan esityspituus 7 bittiä, luku (itseisarvo-etumerkki muotoinen) B=11001 (=-910). Ensimmäinen bitti kertoo etumerkin ( 1 = -)ja sitten tulee luvun suuruusosa (4 bittiä).
  • Nyt ei taaskaan kosketa lainkaan etumerkkiin. Huomataan kuitenkin, että suuruusosa on vain 4 bittiä pitkä, joten siihen lisätään nollia. Näin saadaan:
    B=10001001, missä lisätyt nollat on lihavoitu.
  • Lopuksi käännetään bitit: C1,7(B) = 11110110, mikä on haluttu tulos
Tuloksen voi tarkistaa muuntamalla sen edelleen 2-komplementiksi ja sitä kautta kymmenjärjestelmään:

2-komplementiksi eli lisätään 1: C2,7(B)=11110111= -27 + 26 + 25 + 24 + 22 + 21 + 20 = -910

Esimerkki 5
Suuruusosan esityspituus 7 bittiä, luku (itseisarvo-etumerkki muotoinen) B=01100 (=1210). Ensimmäinen bitti kertoo etumerkin (0 = +)ja sitten tulee luvun suuruusosa (4 bittiä).
  • Nyt ei taaskaan kosketa lainkaan etumerkkiin. Huomataan kuitenkin, että suuruusosa on vain 4 bittiä pitkä, joten siihen lisätään nollia. Näin saadaan:
    B=00001100, missä lisätyt nollat on lihavoitu.
  • Lopuksi käännetään bitit: C1,7(B) = 00001100, mikä on haluttu tulos

    HUOM! Tässä oli siis positiivisen luvun muuntaminen 1-komplementtiin. Tarkkasilmäisimmät voivat huomata, että luku ei muuttunut lainkaan (mitä nyt nollia tuli lisää..) Jos tämä tuntuu hämärältä ks. selitystä aiemmin komplementin johdannon kohdalta.
Tuloksen voi tarkistaa muuntamalla sen edelleen 2-komplementiksi ja sitä kautta kymmenjärjestelmään:

Muuntaminen 2-komplementiksi on helppoa positiivisen luvun tapauksessa. Ei tehdä mitään muutoksia eli: C2,7(B)=00001100= 23 + 22 = 1210

2-komplementti muodostetaan joko 1-komplementin kautta lisäämällä siihen 1 (kuten edellisen esimerkin tarkistusosassa) tai suoraan seuraavalla algoritmillä:

  • aloitetaan vähiten merkitsevästä bitistä
  • jos bitti on 0 sitä ei muuteta, vaan siirrytään seuraavaan
  • ensimmäinen vastaantuleva 1-bitti säilytetään ennallaan
  • loput bitit käännetään (kaikki)

Esimerkki
Suuruusosan esityspituus 7 bittiä, luku B=10100= 0010100 ( = 10 10 ) C2,7(B)=1101100 ( = -10 10 )


Muiden lukujärjestelmien komplementeista

Komplementti voidaan ottaa myös muissa lukujärjestelmissä kuin binäärijärjestelmässä. Tässä on esitetty esimerkinomaisesti miten tapahtuu r-kantaisen komplementin ottaminen. r-kantaisesta luvusta voidaan ottaa r-kantainen komplementti (radix complement) tai vähennetty r-kantainen komplementti (diminished radix complement, r-1))

r-kantaisen luvun N (joka on esitetty n:llä numerolla) r-kantainen komplementti lasketaan kaavalla Kr=rn-N.

Vastaavasti samaisen r-kantaisen luvun N , r-1 komplementti lasketaan kaavalla Kr-1=(rn-1)-N.
Tämä on helppo laskea, sillä se saadaan suoraan vähentämällä jokainen luvun N numero (n) numerosta (r-1). Esimerkkinä on alla muunnettu muutamia lukuja niiden komplementeikseen.

Esimerkki 1
Luku +378 (=3110) on itseisarvo-etumerkki muodossa.
  • Muistetaan, että komplementoitaessa positiivista lukua ei luvulle tapahdu mitään. Näin ollen:

    +378 komplementoituna on 378

Tuloksen voi tarkistaa muuntamalla sen takaisin 10-järjestelmään:

378 = 3 × 81 + 7 × 80 = 24 + 7 = 3110

Esimerkki 2
Selitys 1
Luku -214 (=-910) on itseisarvo-etumerkki muodossa.
  • Negatiivisen luvun komplementoinnissa on syytä olla tarkkana !
  • Luku -214 on 4-kantainen --> r=4.
  • Luvussa -214 on kaksi numeroa --> n=2.

  • Muodostetaan vähennetty (r-1) komplementti, koska se on helpompi. --> Vähennetään kahdesta numerosta (n), jotka ovat suurudeltaan (r-1), luku N
    Siis r-1 = 3, n=2 ja N=-214 --> Tästä saadaan (r-1):n komplementiksi 334-214=124. Tämä osoittaisi luvun olevan positiivinen!! Tämän vuoksi luvun eteen lisätään numero 3
  • r-1:n komplementti on siis 3124
  • r:n komplementti saadaan sitten (r-1):n komplementista lisäämällä lukuun 1:nen ts. 3124+14=3134


Selitys 2
  • Ensinnäkin huomataan, että suurin mahdollinen luku 4-järjestelmässä kahdella numerolla esitettynä on 334. Tämä vastaa lukua -110 komplementoinnin takia.
    Kun luvun ensimmäinen numero on 0 tai 1 = (+) on kyseessä positiivinen luku ja kun ensimmäinen numero on 2 tai 3 = (-), on kyseessä negatiivinen luku. Näin ollen:

    Nyt tiedetään, että tulokseksi on tulossa negatiivinen luku ts. komplementoidun luvun ensimmäinen numero on 2 tai 3

    Lasketaan 334-214+14 = 134 Tämä on väärin! Ensimmäinen numero osoittaisi luvun olevan positiivinen, mitä se ei ole!!

    Tarvitsemme siis esitystä kolmella numerolla jolloin luku 3334 = -110

    Lasketaan 3334-214+14 = 3134
    Tämä on haluttu vastaus.

Hieman lisäselvitystä
  1. Suurin luku 4-järjestelmässä on kahdella numerolla 33 tai kolmella 333. Vastaavasti 9-järjestelmässä 88 tai 888.
    Tämä suurin luku vastaa lukua -110, mikäli ei olla itseisarvo-etumerkki-esityksessä. (Tällöinhän luvun etumerkin ilmoittaa suoraan + tai -)
  2. Pienin negatiivinen luku olisi esimerkin tapauksessa 2004 = -3210
  3. Se miksi laskutoimituksissa on mukana +1 johtuu siitä, että aloitamme vähennyslaskun laskemisen luvusta -110, emmekä luvusta 010
    Toisin sanoen, mikäli emme lisäisi lukua +1, olisi edellinen muunnos ollut luvusta -224
  4. Luku +1 voidaan myös jättää lisäämättä, mutta silloin täytyy muistaa tietenkin vähentää vain -204 (Esimerkkimme tapauksessa)

Tuloksen voi tarkistaa muuntamalla sen takaisin 10-järjestelmään:

-(3334-3134+14) = -(21)4 = -(2 × 41 + 1 × 40) = - (8 + 1) = -910

Esimerkki 3
Muunnettava luku 1A11 takaisin 10-järjestelmään.
  • Luvussa ei näy etumerkkiä, joten tulkitaan se positiiviseksi luvuksi ensimmäisen numeron perusteella.(0-->5 = + ja 6-->A = -)

  • Nyt muuntaminen käy helposti, koska luku on positiivinen. Muunnetaan se aivan normaalisti (Komplementtiesityksessähän positiiviset luvut säilyvät muuttumattomina)

  • 1 × 111 + 10 × 110 = (11 + 10) = 2110
Hieman lisäselvitystä
  1. Luku A11 vastaa lukua 1010. Muita kirjaimia kuin A ? ---> -Ks. taulukko aiemmin, jossa oli esitelty mm. heksadesimaaliluvut, oktaaliluvut ja desimaaliluvut. Taulukon löydät lukujärjestelmä osion alusta.

Esimerkki 4
Muunnettava 9-järjestelmän 9-komplementin luku 829 takaisin 10-järjestelmään.
  • Luku on negatiivinen ensimmäisen numeron perusteella (0-->4 = + ja 5-->8 = -)
  • Nyt mietitään mikä on suurin mahdollinen luku (kahdella numerolla, koska tehtävänantokin oli kahdella numerolla) 9-järjestelmässä.
  • Suurin mahdollinen luku on 889 = -110

  • Nyt tehdään laskutoimitus: 889 - 829 = 69
    69 + 19 = 79

  • Lopuksi muunnetaan 79 10-järjestelmään kuten on aiemmin opittu ja muistetaan vielä, että käsitellään negatiivista lukua. Tulokseksi saadaan : -710
Hieman lisäselvitystä
  • Miksi laskutoimituksessa lisätään yksi "ylimääräinen" ykkönen?

    Tämä tehdään siksi, että jos olisi seuraavanlainen tilanne: Pitäisi muuntaa luku 889 takaisin
    10-järjestelmään. Tällöin muunnos 889-889 = 010. Tämä antaisi tulokseksi luvun nolla. Kuitenkin on sovittu, että 889 vastaa lukua -110. Tämän takia vähennetään yksi "ylimääräinen" ykkönen. Tämä tapahtuu laskemalla 09 + 19 = 19 , joka muunnetaan 10-järjestelmään muistaen kuitenkin, että kyse on neg.luvusta 19 ==> -110. Tämä on haluttu (ja oikea) lopputulos

Lisätietoja:


Tämän sivun sisällöstä vastaa aura@wooster.hut.fi
URL: http://signal.hut.fi/digis/luento2/komplementti
Sivua on viimeksi päivitetty 9.1.2007.