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ä () 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 
 käännetään binäärisanan kaikki bitit (jolloin saadaan yhden komplementti)
 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ä.

Luokka:Tietokonearitmetiikka