Kahden komplementti

Kahden komplementti on binääriluvun esitys, jota käytetään tietokoneissa yksinkertaistamaan vähennyslaskutoimitusta. Kahden komplementtia käytettäessä vähennyslasku muuntuu tavalliseksi yhteenlaskuksi, jonka tietokone voi helposti suorittaa. Silloin riittää, kun huolehditaan yhteenlaskussa ylivuototapauksessa muistinumeron carry-bitistä. Vähennyslaskun lainaus eli borrow-bittiä ei silloin laskuissa tarvita.

Yleisesti kahden komplementti -esitystä käytetään tietokoneissa myös osoittamaan negatiivisia lukuja (eli lukuja jotka ovat <0). Jotkut tietokoneet ilmaisevat negatiivisen luvun kuitenkin vaihtoehtoisella etumerkillä (engl. sign-bit) menettelyllä, jolloin binäärisanan ylintä bittiä (MSB) käytetään osoittamaan luvun negatiivisuutta. Komplementtiesityksellä saavutetaan muitakin etuja, edellä mainitun vähennyslaskun lisäksi. Sillä voidaan muun muassa esittää yhtä suurempi numeroavaruus tietokoneen muistissa, kun nollaa ei tarvitse koodata kahdesti. Tietokoneen muistissa olevan datan arvoalue voi silloin olla negatiivisella puolella yhtä suurempi. Esimerkiksi 16 bitin tapauksessa −32 768…32 76710.

Kahden komplementin muodostaminen muokkaa

  1. käännetään binäärisanan kaikki bitit (jolloin saadaan yhden komplementti)
  2. lisätään yksi (jolloin saadaan kahden komplementti)


Esimerkki 1 muodostetaan luvun 310 kahden komplementti

Binääriesitys luvulle 310  0112
Käännetään bitit           1002  (=yhden komplementti)
Lisätään yksi              + 12  (=lisätään 1)
                           ====
                           1012  (=luvun 0112  kahden komplementti)

Esimerkki 2 lasketaan 1510 – 310 =1210 käyttäen 8-bittistä kahden komplementtia

Binääriesitys luvulle 1510      0000 11112      
Binääriesitys luvulle 310       0000 00112      
Luvun 310 kahden komplementti   1111 11012

Yhteenlaskun suorittaminen:   
 111111 111        (carry)
  0000 11112      (1510)
+ 1111 11012      (−310)
===========
  0000 11002      (1210)  (yhteenlaskun viimeinen carry äärimmäisenä vasemmalla MSB päässä jätetään huomiotta) 
Taulukko 10-kantaisen ja binäärisen 8-bittisen luvun arvojen välillä:
Desimaalinen 10-kanta Binäärinen 2-kanta 1-komplementti 2-komplementti
010 000000002 111111112 000000002
110 000000012 111111102 111111112
210 000000102 111111012 111111102
310 000000112 111111002 111111012
1210 000011002 111100112 111101002
9610 011000002 100111112 101000002
9710 011000012 100111102 100111112
12710 011111112 100000002 100000012

Kahden komplementtia ei pidä sotkea Alternate Mark Inversion -koodaukseen (AMI-koodiin) eikä Gray-koodiin. AMI-koodia käytetään tiedonsiirrossa (yhdessä tai erikseen muiden linjakoodien kuten HDB-3 ja 4B3T kanssa) muuttamaan binäärinen RZ koodi NRZ koodiksi. Gray-koodia käytetään mm. sektorikiekkoantureissa minimoimaan lukuvirheitä.