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

  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-kantaBinäärinen 2-kanta1-komplementti2-komplementti
010000000002111111112000000002
110000000012111111102111111112
210000000102111111012111111102
310000000112111111002111111012
1210000011002111100112111101002
9610011000002100111112101000002
9710011000012100111102100111112
12710011111112100000002100000012

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