Bitműveletek, hatékony programok írása. Pointer, pointer tömb kapcsolat Flashcards
Mik a bitműveletek?
Ezek olyan műveletek, amiket bit szinten lehet végezni. A byte műveletekhez hasonlóan (&&, ||) a bitműveletek bemenő paramétere is legalább 1 byte méretű, hiszen 1 byte a legkisebb méret, amivel memóriaterületet lehet lefoglalni. A C-ben található bitműveletek megtalálhatók C++ nyelvben is.
példa program a bitműveletekre.
deklaráció.
#include using namespace std;
int main() { Két változó: a és b, decimálisan és binárisan. unsigned int a = 60; // 60 = 0011 1100 unsigned int b = 13; // 13 = 0000 1101 int c = 0;
példa program a bitműveletekre.
&
Az első bitművelet a & (bitwise AND). a két szám ugyanazon helyiértéken (bináris helyiértéken) lévő bitje 1, akkor az & operátor is 1-et ad vissza. Ezáltal láthatjuk, hogy a & b = 0000 1100.
c = a & b; // 12 = 0000 1100
cout «_space;“Line 1 - Value of c is : “ «_space;c «_space;endl ;
példa program a bitműveletekre.
|
A | (bitwise OR) művelet hasonlít az előbbi &-hez, viszont itt elég ha az egyik bit 1, akkor a | művelet már 1-et ad vissza.
c = a | b; // 61 = 0011 1101
cout «_space;“Line 2 - Value of c is: “ «_space;c «_space;endl ;
példa program a bitműveletekre.
^ (xor)
A ^ (bitwise XOR) magyarul kizáró vagy művelet akkor ad vissza 1-et, ha a két változó azonos helyiértékein csak az egyik változó esetén van 1.
c = a ^ b; // 49 = 0011 0001
cout «_space;“Line 3 - Value of c is: “ «_space;c «_space;endl ;
példa program a bitműveletekre.
~ (not)
A ~ (bitwise not). Bitenként nézi meg és állítja át az ellentétes értékre az összes bitet. (ha megkérdezik, hogy az hogy lett -61, akkor azt kell mondaNI, hogy a gép csinálta így).
c = ~a; // -61 = 1100 0011
cout «_space;“Line 4 - Value of c is: “ «_space;c «_space;endl ;
példa program a bitműveletekre. «_space;left shift
A «_space;(left shift) művelet annyit csinál, hogy eltolja bemenő parméternyilvel a biteket bal irányba, tehát 0011 1100-ból 1111 0000 lesz. Egy eltolás kettővel való szorzásnak felel meg, tehát ha kettővel toljuk el, akkor 4-szeres szorzás lesz az eredmény. 4*60 = 240.
c = a «_space;2; // 240 = 1111 0000
cout «_space;“Line 5 - Value of c is: “ «_space;c «_space;endl ;
példa program a bitműveletekre. A»_space; right shift
A»_space; (right shift) művelet ugyanaz, mint a left shift, csak osztással.
c = a»_space; 2; // 15 = 0000 1111
cout «_space;“Line 6 - Value of c is: “ «_space;c «_space;endl ;
return 0;
}
Miért hasznosak számunkra a bitműveletek? Egy példát mutass.
Példa: két szám átlaga osztás művelet nélkül. #include using namespace std; int floorAvg(int x, int y) { return (x + y) >> 1; } int main() { cout<< floorAvg(13,28 ); return 0; }
Milyen változókon tudnak műveleteket végrehajtani a bitműveletek? Ebből mi következik?
short, long, int vagy char, ezért páratlan összeg esetén nem kapunk pontos átlagot, de ez a verzió egész számok esetén gyorsabb, mint ha az osztás operátort használnánk. Ugye itt annyi történik, hogy a két számot összeadjuk, utána 1-gyel eltoljuk balra a biteket (tehát 2-vel osztunk).
mik a pointerek c++-ban? Mi kell a deklarálásukhoz?
C++-ban minden változó a memóriában tárolódik, egy memória cím alatt. A változó értéke ezen a memória címen van tárolva. A pointer egy olyan változó, ami egy másik változó memória címét tárolja. Deklarálása a * (pointer to operator) operátorral történik. Mivel a c++ egy statikusan típusos nyelv, ezért a deklaráláshoz kell egy típus is. Pl:
int *numberPointer;
mit csináltunk azzal, hogy int * numberpointer;?
Inicializáltunk ezzel egy pointert, viszont ez nem mutat sehova, tartalma 0x0. Adhatunk neki viszont értéket, mondjuk egy integer változó memóriacímét.
mire jó az & operátor a pointereknél?
Ezt a & (reference) operátorral tesszük meg. Pl:
numberPointer = &number;
A & operátor az adott változó memória címét adja vissza. Ezzel most már egy változó értékére mutat a pointerünk.
a * operátorral mit lehet még csinálni a pointereknél?
segítségével meg tudjuk változtatni a pointer által azt az értéket, amire mutat. Pl:
*numberPointer = 4;
Mire jók ezek a pointerek?
a függvényt meg lehet írni úgy is, hogy a bemenő paramétere ne egy sima változó legyen, hanem egy pointer. Ez azért jó, mert ilyenkor nem jönnek létre azok az extra változók a függvényhívásoknál, tehát kevesebb memóriát fog használni a programunk. A függvény közvetlenül tudja a változó értékét változtatni.