Nú hafa eflaust allir lesið greinina um Binary, eða Base-2 talnakerfið og ættu að skilja út á hvað það gengur. Þá er komið að því að kynna nokkrar aðgerðir sem hægt er að nota á þetta. Þessar aðgerðir kallast Bitwise operators.

Fyrst er það AND, í C málum er operator-inn “&” (vissulega án gæsalappa), nú verður kannski nokkrum ljóst af hverju það þarf að nota tvö & merki þegar það er verið að bera saman, t.d. í if (if (a && b = 0)). Allur galdurinn á bakvið AND er að það er tekið á móti tveimur tölum, og hver biti borin saman á milli talna, ef báðir bitar eru 1, þá er skilað 1, annars 0.

Hér er tafla sem sýnir alla möguleika:

1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0

Tökum dæmi um tvær tölur, 12 og 5 og sjáum við gerist ef við notum AND á þær. Fyrst færum við tölurnar í binary:

11 00
01 01

Fyrst tökum við aftasta bitann, og athugum hvort þeir séu báðir 1, ef svo er, þá verður aftasti bitinn í niðurstöðunni 1, annars 0. Þannig er haldið áfram fyrir alla bitana. Útkoman úr 11 00 & 01 01 er þá 01 00.

Með þessari tækni er t.d. einfalt að breyta lágstöfum í hástafi, ef þið skoðið ASCII töfluna þá sjáið þið að það eru nákvæmlega 32 á milli talnanna fyrir hástafi og lágstafi (þetta á ekki við um íslensk sértákn). A = 65 og a = 97. Þar af leiðandi getum við séð að það þarf einungis að slökkva á sjötta bitanum til að breyta lágstaf í hástaf. Við vitum þetta vegna þess að sjötti bitinn táknar 32. Dæmi um kóða:

char ch;
cin >> ch;
ch = ch & 223;
cout << ch;

Nú spyrja kannski sumir af hverju við notum töluna 223, ef þú færir 223 í binary, þá sérðu hvers vegna það er. Hún lítur svona út:

11 01 11 11

Þar sem að AND skipunin breytir öllum bitum í núll, nema 1 sé í báðum tölum, þá sjáum við að með því að nota þessa tölu, þá breytir AND skipunin engum bitum, nema þeim sjötta, sem er settur á 0 hjá okkur. Í raun erum við bara að slökkva á sjötta bitanum.

Næst er það OR, operatorinn fyrir það í C málum er “|” eða pípan. OR kannar hvern bita fyrir sig og skilar til baka 1 ef 1 er í öðrum hverjum bitanum.

Aftur tafla til að sýna alla möguleika.

1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0

Ef við tökum aftur sama dæmi og úr AND:

11 00
01 01

Nú breytum við öllum bitum í 1 ef annar hvor bitinn er 1, annars er núll áfram. 11 00 | 01 01 = 11 01.

Með þessu getum við svo breytt lágstöfum í hástafi, öfugt við það sem við gerðum með AND.

char ch;
cin >> ch;
ch = ch | 32;
cout << ch;

Hér notum við 32 í stað 223 vegna þess að 32 á binary með átta bitum er svona:

00 10 00 00

Þannig breytum við engu, nema sjötta bitanum, sem verður alltaf 1. Við erum semsagt að kveikja á sjötta bitanum.

XOR ber líka saman hvern bita fyrir sig, en setur þá aðeins á 1 svo framarlega sem bitarnir eru ekki eins í báðum tölum. Operatorinn er “^”.

Tafla gjörið svo vel:

1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0

Höldum okkur við sama dæmi:

11 00
01 01

Nú breytum við bitum í 1 bara ef báðir bitar eru ekki eins, 11 00 ^ 01 01 = 10 01

Nú stel ég smá dæmi sem Popcorn kom með sem greinarsvar við fyrri grein minni til að sýna mögulega notkun á þessu. En það er að taka tvær tölur og láta þær skiptast á gildum, án þess að nota geymslu breytu, ég ætla bara að nota fjóra bita fyrir hverja tölu, en long er t.d. 32 bitar og short 16.

Við erum með eftirfarandi tölur
A = 12 eða 11 00 á binary.
B = 5 eða 01 01 á binary.

Til að láta þesar tvær breytur skiptast á gildum getum við keyrt eftirfarandi kóða á þær:

A = A ^ B;
B = A ^ B;
A = A ^ B;

Eftir þetta inniheldur B töluna 12 og A töluna 5. Skoðum nú hvað gerist á binary formi:

A = A ^ B
Þarna keyrum við XOR á 12 og 5,
11 00
01 01
XOR = 10 01

Við setjum þetta gildi inn í breytuna A, þar af leiðandi geymir A núna töluna 9. Svo keyrum við aftur XOR á A og B, tölurnar eru núna

B = A ^ B;
10 01
01 01
XOR = 11 00

Þetta setjum við í breytuna B, sem inniheldur þá núna töluna 12. Keyrum svo XOR aftur á tölurnar sem við erum með:

A = A ^ B;
10 01
11 00
XOR = 01 01

Og setjum í breytuna A, sem inniheldur þá núna töluna 5. Þannig að núna hefur tala A gildið 5 en talan B gildið 12, við erum semsagt búin að snúa gildunum algjörlega við.

Með fyrirvara um allskonar villur og takk Popcorn :)