Binaararitmeetika ja kahe täiend

Visualiseeri bittide kaalud, uuri märgiga esitusi ja jälgi arvutamist veergude kaupa.

Interaktiivse simulatsiooni laadimine...

Üksainus liitja teeb ka lahutamise 🖖

Kaasaegsetes arvutites esindatakse negatiivseid täisarve kahe komplementi abil. Kõige kõrgemal positsioonil olev bitt (MSB) toimib negatiivse kaaluna: 8-bitise täisarvu puhul esindab bitt 7 -128, mitte +128. Lahutamine muutub identseteks liitmisega: protsessor arvutab A - B kui A + (~B + 1), elimineerides eraldi lahutamise riistvara ja võimaldades ALU-l kasutada samu loogikaskeeme mõlema operatsiooni jaoks.

Kahendsüsteem on lihtsalt kohaväärtus alusel 2 🖖

Tavalistes arvudes on iga veerg kümme korda väärtuslikum kui temast paremal olev; kahendsüsteemis on tegur lihtsalt 2. Bitid kannavad (paremalt vasakule) kaalusid 1, 2, 4, 8, 16, 32, … Kahendarvu lugemine tähendab kaalude liitmist seal, kus on 1: 1011 on 8 + 0 + 2 + 1 = 11. Tööriista bitikaalude kuva laseb sul iga bitti lülitada ja jälgida jooksvat summat — see ongi kõigi siinsete teisenduste saladus.

Sinu protsessor korrutab nagu vene talupoeg 🖖

Siin näidatav pikk korrutamine — A kahekordistamine ja liitmine seal, kus B-l on 1-bitt — on täpselt „vene talupoja korrutamine", meetod, mida leidub juba üle 3000 aasta vanustel Egiptuse papüürustel. Üht arvu poolitatakse (jääke ära visates) ja teist kahekordistatakse, seejärel liidetakse kahekordistatud väärtused seal, kus poolitatud arv on paaritu. Poolitamine ja paarituse kontroll ongi sisuliselt kahendnumbrite lugemine, nii et iidne kirjatundja ja tänapäevane ALU käivitavad sama algoritmi.

KAHEKSA BITTI, NELI TÄHENDUST — MILLIST KODEERINGUT SA LOED?

Millises kahendkodeeringus sa oled?

Bait ei anna ühtegi vihjet selle kohta, kuidas teda lugeda. Muster 11010110 on 214 või −42 või −41 või −86, olenevalt ainuüksi eelnevalt kokku lepitud kokkuleppest — ja bitid ise ei suuda sulle öelda, milline neist kehtib. Vali valesti ja kõik edasine on vale, kusjuures kõik edasine näeb ikka õige välja. Nii et esimene küsimus pole kunagi see, mis on vastus, vaid see, mida kaalub ülemine bitt. Neli allolevat kodeeringut vastavad sellele neljal moel; kaks viimast juhtumit näitavad, miks üks neist riistvara endale võitis.

Märgita — iga veerg liidab w₇ = +128 → 0…255
Kahendtäiend — ülemine bitt võlgneb sulle 128 w₇ = −128 → −128…127
Ühetäiend — vastandarv iga biti ümberpööramisega w₇ = −127, 0 = ±0
Märk ja absoluutväärtus — bitt, mis ei ole arv w₇ = ±, 0 = ±0
Lahutamine ilma lahutajata a − b = a + (¬b + 1)
Korrutamine nihutamise ja liitmise abil a × b = ∑ (a ≪ i)

01

Märgita — iga veerg liidab

Mida sa tead: Kõik kaheksa kaalu on kahe positiivsed astmed, 1 kuni 128. Miski ei kodeeri märki, seega ei saa miski olla negatiivne: vahemik on 0 kuni 255 ja kõik 256 mustrit on kasutuses.

Kuidas seda lugeda: w₇ = +128 → 0…255

Näidisarvutus: 85 + 11 → 01010101 + 00001011 = 01100000 = 96, kusjuures ülekanded liiguvad madalatest veergudest üles. Mine kaugemale ja 214 + 100 annab kaheksa bitiga 58 — tõelised 314 miinus 256, kus puuduv 1 ripub väljuvas ülekandes.

Ava see juhtum: Märgita liitmine
Märgita — iga veerg liidab. Kõik kaalud positiivsed: kaheksa veergu lihtsalt liidavad, 0 kuni 255. Kõik kaheksa kaalu on kahe positiivsed astmed, 1 kuni 128. Miski ei kodeeri märki, seega ei saa miski olla negatiivne: vahemik on 0 kuni 255 ja kõik 256 mustrit on kasutuses.
Kõik kaalud positiivsed: kaheksa veergu lihtsalt liidavad, 0 kuni 255.

02

Kahendtäiend — ülemine bitt võlgneb sulle 128

Mida sa tead: Seitse positiivset kaalu ja üks negatiivne: bitt 7 väärtus on −128 asemel +128. Muud ei muutu ja vahemik nihkub −128 kuni 127.

Kuidas seda lugeda: w₇ = −128 → −128…127

Näidisarvutus: 11010110 laguneb −128 + 64 + 16 + 4 + 2 = −42. Liida 10 (00001010) tavalise veerghaaval liitmisega ja saad 11100000 = −128 + 64 + 32 = −32. Täpselt needsamad kaheksa bitti on märgita režiimis 214.

Ava see juhtum: Kahendtäiend
Kahendtäiend — ülemine bitt võlgneb sulle 128. Bitt 7 kaalub −128, seega 11010110 on −42 — needsamad bitid, mida märgita režiim nimetab 214-ks. Seitse positiivset kaalu ja üks negatiivne: bitt 7 väärtus on −128 asemel +128. Muud ei muutu ja vahemik nihkub −128 kuni 127.
Bitt 7 kaalub −128, seega 11010110 on −42 — needsamad bitid, mida märgita režiim nimetab 214-ks.

03

Ühetäiend — vastandarv iga biti ümberpööramisega

Mida sa tead: Bitt 7 kaalub −127. Negatiivne arv on oma absoluutväärtuse bitthaaval vastand, seega −42 on 11010101 ja mitte 11010110, ning vahemik on sümmeetriline: −127 kuni 127.

Kuidas seda lugeda: w₇ = −127, 0 = ±0

Näidisarvutus: −42 on 11010101, mis on 00101010 vastand. Kui liita 10, tuleb 11011111 = −127 + 64 + 16 + 8 + 4 + 2 + 1 = −32, ja see on siin õige ainult seetõttu, et ülemisest veerust ei väljunud midagi. Proovi hoopis −42 + 50: lihtne summa loeb 7, ühe võrra vähem, ja väljuv ülekanne tuleb alt uuesti sisse anda, et jõuda kaheksani.

Ava see juhtum: Ühetäiend
Ühetäiend — vastandarv iga biti ümberpööramisega. −42 on lihtsalt ümberpööratud 42 ja 11111111 on teine, negatiivne null. Bitt 7 kaalub −127. Negatiivne arv on oma absoluutväärtuse bitthaaval vastand, seega −42 on 11010101 ja mitte 11010110, ning vahemik on sümmeetriline: −127 kuni 127.
−42 on lihtsalt ümberpööratud 42 ja 11111111 on teine, negatiivne null.

04

Märk ja absoluutväärtus — bitt, mis ei ole arv

Mida sa tead: Bitt 7 on puhas lipp, millel pole mingit kaalu: 0 tähendab positiivset, 1 negatiivset, ja alumised seitse bitti hoiavad tavalist absoluutväärtust 0 kuni 127.

Kuidas seda lugeda: w₇ = ±, 0 = ±0

Näidisarvutus: −42 on 10101010: märgibitt seatud ja siis 42 kujul 0101010. Nii kirjutavad arve inimesed, ja see on neljast ainus kodeering, kus mõlema operandi andmine tavalisele liitjale on lihtsalt vale — 10101010 + 00001010 tuleb välja kui 10110100, mis loeb −52 ja mitte −32.

Ava see juhtum: Märk ja absoluutväärtus
Märk ja absoluutväärtus — bitt, mis ei ole arv. Märgibitt ei kanna kaalu — ja tavaline liitja annab −52 asemel −32. Bitt 7 on puhas lipp, millel pole mingit kaalu: 0 tähendab positiivset, 1 negatiivset, ja alumised seitse bitti hoiavad tavalist absoluutväärtust 0 kuni 127.
Märgibitt ei kanna kaalu — ja tavaline liitja annab −52 asemel −32.

05

Lahutamine ilma lahutajata

Mida sa tead: Kahendtäiend, tehe seatud lahutamisele. Riistvaral ei ole lahutusahelat: ta leiab teise operandi vastandarvu ja liidab.

Kuidas seda lugeda: a − b = a + (¬b + 1)

Näidisarvutus: 42 − 58 → pööra 00111010 ümber, saad 11000101, liida 1 ja tuleb 11000110, mis on −58. Nüüd liida sellele 00101010: 11110000, ja see loeb −128 + 64 + 32 + 16 = −16.

Ava see juhtum: Lahutamine liitmise abil
Lahutamine ilma lahutajata. Pööra ümber, liida üks, siis liida: 42 + (−58) maandub −16 peal. Kahendtäiend, tehe seatud lahutamisele. Riistvaral ei ole lahutusahelat: ta leiab teise operandi vastandarvu ja liidab.
Pööra ümber, liida üks, siis liida: 42 + (−58) maandub −16 peal.

06

Korrutamine nihutamise ja liitmise abil

Mida sa tead: Märgita režiim, tehe seatud korrutamisele. Iga teise operandi 1-bitt annab kaasa koopia esimesest, nihutatud vasakule selle biti koha võrra.

Kuidas seda lugeda: a × b = ∑ (a ≪ i)

Näidisarvutus: 13 × 5 → 5 on 00000101, seega on seatud bitid 0 ja 2. See annab kaasa nihutamata 13 (00001101 = 13) pluss kaks kohta nihutatud 13 (00110100 = 52), ja 13 + 52 = 65 = 01000001.

Ava see juhtum: Nihuta ja liida
Korrutamine nihutamise ja liitmise abil. Viiel on seatud bitid 0 ja 2, seega loevad ainult read 13 ja 52. Märgita režiim, tehe seatud korrutamisele. Iga teise operandi 1-bitt annab kaasa koopia esimesest, nihutatud vasakule selle biti koha võrra.
Viiel on seatud bitid 0 ja 2, seega loevad ainult read 13 ja 52.

Ülesanne täielikult lahendatud

  1. Kaks eraldi ületäitumislippu 42 teisendamisel kaheksasse bitti 6 sammu

    Teisenda 42 kaheksaks bitiks kahel eri viisil ning seejärel selgita välja, miks on protsessoris kaks eraldi ülevoolulippu, kui sel on vaid üks liitja.

    1. Positsioonisüsteem on astmete summa, seega on otsetee leida, millised kahe astmed on esindatud. Neid on kolm ja bitimuster ongi käes.

    2. Mehaaniline viis annab sama vastuse ilma igasuguse otsimiseta. Jaga korduvalt kahega ning jäägid ongi bitid, alates noorimast — loe veergu alt üles.

    3. Märgi muutmine kahe täiendis tähendab inverteerimist ja seejärel ühe liitmist ning tulemus võrdub 256 − 42. Selles kogu trikk seisnebki: aritmeetika mooduli 256 järgi, kus ülemine pool on ümber tähistatud negatiivseks.

    4. Nüüd lipud. Väljundülekanne on vanima bitikoha omadus; ülevool on mittevastavus märgibitti siseneva ja sellest väljuva ülekande vahel.

    5. Võta paar, mille puhul kaks lippu ei lange kokku. Baidist ülekannet ei välju, seega on märgita aritmeetika korras, kuid märgibitt pöördus — märgiga vastus eksib 256 võrra.

    6. Võta vastupidine näide paariga, mis annab ülekande, kuid ei tekita ülevoolu, ja kahe lipu vajalikkus on sellega tõestatud.

    Vastus

    Sest samad bitid tähendavad kahte eri arvu ja vaid programmeerija teab, kumba. Tehe 0110 0100 + 0011 0010 = 1001 0110 ei tekita bitist 7 ülekannet, seega C = 0 ning märgita tõlgendus 100 + 50 = 150 on täiesti õige. Loe sama tulemust kahe täiendis ja see on −106, mis on mõttetus, ning V = 1 kinnitab seda. Liida selle asemel 200 + 100 ning lipud vahetuvad: C = 1, V = 0. Liitja ei tea ega hooli — see arvutab ühe summa ja tõstab mõlemad häired ning käsk, mille kompilaator hiljem valib, otsustab, kumb neist on viga. Seepärast jätavad C ja C++ märgiga ülevoolu määratlemata ning defineerivad märgita arvu ümberkerimise: riistvara eristab neid ja keel otsustas seda nähtavale tuua.

Allikad (1)

Näiteülesanded

  • Märgita liitmine - 85 + 11 kahendsüsteemis, ülekanne liigub veergude kaudu edasi.
  • Kahendtäiend - Kahendtäiend: 11010110 tähendab −42 ja −42 + 10 = −32.
  • Ühetäiend - Ühetäiend: ülemine bitt kaalub −127, seega −42 on 11010101.
  • Märk ja absoluutväärtus - Märk ja absoluutväärtus: ülemine bitt on puhas märk, seega −42 on 10101010.
  • Lahutamine liitmise abil - 42 − 58 = −16 näitab, kuidas lahutamine muutub liitmiseks tänu ülemise biti negatiivsele kaalule.
  • Nihuta ja liida - 13 × 5 = 65 kahendsüsteemi nihuta-ja-liida korrutamise abil.