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 :)