Operacijos su bitais (0)
Sveikieji skaičiai kompiuteryje vaizduojami dvejetainėje skaičiavimo sistemoje, todėl jie gali būti laikomi bitų laukais arba iš nulių ir vienetų sudarytais dvejetainiais vektoriais. Tokie vektoriai plačiai vartojami kompiuterio įrenginių būviams arba fizinėms duomenų realizavimo struktūroms aprašyti. Todėl tvarkant duomenis fiziniame lygyje arba analizuojant kompiuterio įrenginių būvius aprašančius duomenis, reikia mokėti manipuliuoti bitų laukais, vartoti specialias bitų tvarkymo operacijas. Populiariausios yra postūmio ir loginės operacijos.
Prisijunk prie technologijos.lt komandos!
Laisvas grafikas, uždarbis, daug įdomių veiklų. Patirtis nebūtina, reikia tik entuziazmo.
Sudomino? Užpildyk šią anketą!
Kiekvienas mums įprastas dešimtainio formato skaičius (1; 10; 1256; -25698,5) kompiuterio atmintyje saugomas skaitmeniniu dvejetainiu pavidalu. T.y. kiekvieną skaičių, raidę ar bet kokį kitokį simbolį galima užrašyti kodine "1" ir "0" seka. Tokia seka dar vadinama dvejetainiu pavidalu. Pavyzdžiui:
dešimtainis skaičius 1 atitinka dvejetainį skaičių 0000 0001
dešimtainis skaičius 2 atitinka dvejetainį skaičių 0000 0010
dešimtainis skaičius 3 atitinka dvejetainį skaičių 0000 0011
dešimtainis skaičius 4 atitinka dvejetainį skaičių 0000 0100
. . .
dešimtainis skaičius 15 atitinka dvejetainį skaičių 0000 1111
dešimtainis skaičius 16 atitinka dvejetainį skaičių 0001 0000
. . .
dešimtainis skaičius 255 atitinka dvejetainį skaičių 1111 1111
Pateiktame pavyzdyje matyti, kaip tolygiai užsipildo dvejetainių skaičių kodai pažingsniui didinat dešimtainį skaičių. Dvejetainiu pavidalu pateiktos 8 "1" ir "0" kombinacijos. Kiekvienas iš tos sekos elementų ("0" arba "1") vadinamas bitu. Tokiu atveju, mes pateikėme kodavimą iš dešimtainio skaičiaus į 8 bitų dvejetainį skaičių. 8 bitai sudaro 1 Baitą. Vadinasi į vieną baitą galima įrašyti ne didesnį kaip 255 skaičių - vėliau persipildo galimos kodavimo kombinacijos, nebėra kur pernešti vyriausio bito ir dvejetainis skaičius grįžta į pradžią (256 atitinka 0000 0000). Štai todėl labai svarbu programuojant parinkti tinkamą kintamojo dydį, kad į jį tilptų norimo ilgio skaičius.
Kadangi kiekvieną skaičių sudaro tokios bitų sekos, vadinasi, turi būti galimybė ir atlikti operacijas su bitais - juos pastumti į dešinę arba į kairę, atlikti kitas logines operacijas. Visos šios operacijos leidžia skaitmeniniu būdu atlikti kitas elementariąsias operacijas - sandaugą, dalybą, skirtumą ir pan.
Postūmio operacijos bendroji struktūra yra tokia:
<Argumentas> <Postūmio kryptis> <Postūmio dydis>
Postūmio kryptis nurodoma simboliais:
>> į dešinę
<< į kairę
Postūmio operacijų pavyzdžiai:
x=1<<3; //suteikiama reiksme 00001000
x=x<<2; //suteikiama reiksme 00100000
x>>=5; //suteikiama reiksme 00000001
Postūmis į kairę atitinka daugybą iš 2, o postūmis į dešinę – dalybą iš dviejų. Taigi postūmio operacijas galima keisti dalybos iš 2 arba daugybos iš dviejų veiksmų sekomis.
x<<=2; //ekvivalentas x=x*2*2
x>>=2; //ekvivalentas x=x/2/2/2
Bitų laukams galima taikyti specialias vektorines logines operacijas, kurios nuo paprastų loginių operacijų skiriasi tuo, kad taikomos visiems argumentų bitams, laikant argumentus bitų vektoriais. C++ kalboje realizuotos šios bitų laukams skirtos loginės operacijos:
~ - loginis neigimas (operacija NE)
| - loginė sudėtis (operacija ARBA)
& - loginė daugyba (operacija IR)
^ - griežtas ARBA
Loginių operacijų rezultatai pateikti lentelėje:
a |
b |
a | b |
a |
b |
a&b |
a |
b |
a ^ b |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
Sveikojo skaičiaus vektorinio loginio neigimo rezultatas yra vadinamas jo atvirkštiniu kodu. Atvirkštinis kodas gali būti vartojamas neigiamiems skaičiams vaizduoti kompiuterio atmintyje, tačiau šiam tikslui geriau tinka papildomas kodas, kuris ir yra vartojamas kompiuteriuose. Papildomas kodas yra gaunamas prie jauniausios atvirkštinio kodo skilties pridedant vienetą (~x+1).
Teigiami skaičiai visuose koduose yra vaizduojami vienodai, o ženklo vaizdavimui yra skiriamas vyriausias bitas. Pliusą jame žymi 0, o minusą – 1.
Operacijų su bitais pavyzdžiai:
char a=3, b=7, c;
c=a; //dvejetainis kodas 00000011
c=-b; //dvejetainis kodas 11111001, kuris atitinka -7
b=a|c; //dvejetainis kodas 11111011, kuris atitinka -5
b=a&c; //dvejetainis kodas 00000001, kuris atitinka +1
a=a^c; //dvejetainis kodas 00000100, kuris atitinka +4
1 programa. Programa parodo ekrane įvesto [0, 255] atkarpos skaičiaus dvejetainį kodą:
#include <iostream.h>
main() {
char i,x,
t=1<<7;
int y=1;
while (y) {
cout <<"Iveskite sveika skaiciu [0,255]:" << endl;
cin >> y;
x=y;
for (i=1; i<=8; i++)
{
if (x&t)
{cout << '1';}
else
{cout << '0';}
x=x<<1;
}
cout << endl;
}
}
2 programa. Teigiamo skaičiaus perkodavimas į neigiamą naudojant išraišką (~x+1):
#include <iostream.h>
main()
{
char i,x;
int y=1;
char t=1<<7;
while (y)
{
cout <<"iveskite teigiama sveikaji skaiciu [0,128]:" <<endl;
cin >>y;
x=y;
x=(~x+1);
cout << "Skaiciaus" << (int)x <<"kodas:";
for (i=1; i<=8; i++)
{
if (x&t)
cout << '1';
else
cout << '0';
x<<=1;
}
cout << endl;
}
}