Matemaatikas on jagamine kahega see, kui arv jagatakse kahega. Mõned kultuurid, näiteks vanad egiptlased, pidasid seda teistsuguseks operatsiooniks kui jagamist. Mõned matemaatikud kuni 16. sajandini (1500-1599) arvasid samuti nii. Tänapäeval käsitletakse jagamist kahega spetsiaalselt kaasaegses arvutiprogrammeerimises.

Jagamist kahega nimetatakse ka poolitamiseks, vahendamiseks ja dimetiseerimiseks.

Mõiste ja põhivõrrendid

Lihtsaim näide: 8 jagatud kahega on 4 (8 ÷ 2 = 4). Kui jagada paaritu arv kahega, tekib kas murdosa (reaalarvude puhul) või jääk (täisarvude puhul). Näiteks 7 ÷ 2 = 3,5 (reaalarvuna) või täisarvude jagamisel 7 ÷ 2 = 3 jäägiga 1.

Olulised mõisted:

  • Paari või paaritu — täisarv on paaris, kui see jagub kahega ilma jäägita (nt 2, 4, 0, -6); muidu on ta paaritu (nt 1, 3, -5).
  • Jääk — täisarvude jagamisel kahega jääk on kas 0 või 1.
  • Poolitamine — jagamine kahega on sama, mis arvu poolitamine (x ÷ 2 või x/2).

Ajalooline taust

Nagu eespool mainitud, oli jagamine kahega mõtlemises ja tehniliste meetodites oluline juba antiikajal. Vanad egiptlased kasutasid sageli poolitamise ja liitmise kombinatsiooni murrude töötlemiseks. Keskaja ja varauusaegsete matemaatikute diskussioonides (sh kuni 16. sajandini) vaadeldi mõnikord jagamist kahega eraldi operatsioonina teistest jagamistest; tänapäeval on see osa üldisest jagamisest, kuid arvutiteaduses on tal omapärane tähtsus, kuna kaks on binaarsüsteemi alus.

Kasutamine programmeerimises

Programmeeringus on jagamisel kahega mitu praktilist ja jõudlust mõjutavat aspekti:

  • Bitiga nihutamine: Täisarvude puhul on jagamine kahega sageli optimeeritav kui >> 1 (paremale nihutamine) — see vastab jagamisele kahega, kui tegemist on mitte-negatiivsete täisarvudega ja kasutatakse loogilist või aritmeetilist nihutust vastavalt tüübile. Näiteks C/C++ või Java puhul x >> 1 annab tavaliselt sama tulemuse kui x / 2 positiivsete täisarvude korral.
  • Negatiivsete arvude nüansid: õigekirjareeglid erinevates keeltes võivad negatiivsete täisarvude korral erineda. Näiteks mõned keele- või kompilaatorispetsiifilised nihutused võivad käituda aritmeetiliselt (säilitavad märgi) või loogiliselt (täidavad nullidega). Ka täisarvude jagamine võib negatiivsetel arvudel ümardada kas nulli poole (nt C, Java) või alaspidi (nt Python koos // operaatoriga).
  • Tüüpide erinevused: ujukomaarvude jagamine (float/double) vs. täisarvuline jagamine — ujukomaarvudes annab x / 2 täpse poolituse murdosana; täisarvudes sõltub tulemus jagamise reeglist (täisarvude jagamisel tekib täisarvuline tulem või jääk).
  • Tõhusus ja optimeerimine: jagamine konstandiga kahe on klassikaline näide, mida kompilaatorid automaatselt nihutusega asendavad (kui see on semantiliselt ohutu). Sellegipoolest tuleb jälgida, et see ei muuda lõpptulemust negatiivsete või märgitugevuste puhul.
  • Turvalisus ja erandid: jagamine nulliga on viga — jagamine kahega ei tekita seda probleemi, aga alati tuleb programmeerimisel arvestada võimalikku nulliga jagamist muude konstantsidega või muutujate puhul.

Praktilised näited

  • Binary search: vahemiku keskpunkt leitakse tihti poolitades indekseid (mid = (low + high) / 2 või ohutumalt low + (high - low) / 2).
  • Pilditöötlus: pildi suuruse vähendamisel kahega (downsampling) tähendab see horisontaalse ja vertikaalse mõõtme poolitamist.
  • Bititaseme algoritmid: maskide ja bittoperatsioonide puhul kasutatakse nihutust (x >> 1) kiireks jagamiseks kahega.

Keelte eripärad (lühike ülevaade)

  • C/C++: täisarvude jagamine x / 2 lõikab tulemuse alla/arvutatakse lähendusega nulli poole (trunc toward zero), x >> 1 võib olla aritmeetiline või loogiline olenevalt implementeerimisest (standard lubab teatud vabadust). Kompilaatorid sageli asendavad /2 nihutusega optimeerimise käigus.
  • Java: integer division käitub kui lähendamine nulli poole; x >> 1 on aritmeetiline paremnihutus (säilitab märgibiti). Java pakub ka loogilist paremnihutust >>>, mis täidab vasakpoolsema kaudu nullidega.
  • Python: / annab alati ujukomaarvu; // on täisarvuline jagamine (ümardab negatiivsetel arvudel allapoole ehk -3 // 2 = -2). Nihutusoperaatorid (x >> 1) töötavad aritmeetriliselt ka negatiivsete täisarvude puhul.

Kokkuvõte

Jagamine kahega on matemaatikas lihtne, ent programmeerimises omab see mitmeid praktilisi nüansse ja optimeerimisvõimalusi. Mõistes erinevusi täisarvulise ja ujukomaarvulise jagamise, nihutuste ja keelte spetsiifika vahel, saab seda operatsiooni kasutada nii korrektselt kui ka tõhusalt erinevates algoritmides ja rakendustes.