Bitműveletek, hatékony programok írása. Pointer, pointer tömb kapcsolat Flashcards

1
Q

Mik a bitműveletek?

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

példa program a bitműveletekre.

deklaráció.

A
#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;
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

példa program a bitműveletekre.

&

A

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 &laquo_space;“Line 1 - Value of c is : “ &laquo_space;c &laquo_space;endl ;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

példa program a bitműveletekre.

|

A

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 &laquo_space;“Line 2 - Value of c is: “ &laquo_space;c &laquo_space;endl ;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

példa program a bitműveletekre.

^ (xor)

A

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 &laquo_space;“Line 3 - Value of c is: “ &laquo_space;c &laquo_space;endl ;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

példa program a bitműveletekre.

~ (not)

A

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 &laquo_space;“Line 4 - Value of c is: “ &laquo_space;c &laquo_space;endl ;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

példa program a bitműveletekre. &laquo_space;left shift

A

A &laquo_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 &laquo_space;2; // 240 = 1111 0000
cout &laquo_space;“Line 5 - Value of c is: “ &laquo_space;c &laquo_space;endl ;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

példa program a bitműveletekre. A&raquo_space; right shift

A

A&raquo_space; (right shift) művelet ugyanaz, mint a left shift, csak osztással.
c = a&raquo_space; 2; // 15 = 0000 1111
cout &laquo_space;“Line 6 - Value of c is: “ &laquo_space;c &laquo_space;endl ;

return 0;
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Miért hasznosak számunkra a bitműveletek? Egy példát mutass.

A
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;
}
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Milyen változókon tudnak műveleteket végrehajtani a bitműveletek? Ebből mi következik?

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

mik a pointerek c++-ban? Mi kell a deklarálásukhoz?

A

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;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

mit csináltunk azzal, hogy int * numberpointer;?

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

mire jó az & operátor a pointereknél?

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

a * operátorral mit lehet még csinálni a pointereknél?

A

segítségével meg tudjuk változtatni a pointer által azt az értéket, amire mutat. Pl:
*numberPointer = 4;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Mire jók ezek a pointerek?

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Alap példaprogram pointerek működésének bemutatására: Deklarálás

A
#include 
using namespace std;
int main() {
Sima változó és pointer deklarálása. (Ezekben még nincs érték)
    int variable;
    int *pointerToVariable;
17
Q

Alap példaprogram pointerek működésének bemutatására: Értékadás az integernek:

A

Értékadás az integer változónak, értékének és memóriacímének kiiratása.
variable = 5;
cout &laquo_space;“Address of variable (&variable): “ &laquo_space;&variable &laquo_space;endl;
cout &laquo_space;“Value of variable (variable): “ &laquo_space;variable &laquo_space;endl &laquo_space;endl;

18
Q

Alap példaprogram pointerek működésének bemutatására: Értékadás a pointernek.

A

Értékadás a pointernek, pointer értékének kiiratása(a memóriacím az értéke),a változó értékének kiiratása, amire a pointer mutat
pointerToVariable = &variable;
cout &laquo_space;“Address that pointerToVariable holds (pointerToVariable): “&laquo_space;pointerToVariable &laquo_space;endl;
cout &laquo_space;“Content of the address pointerToVariable holds (*pointerToVariable): “ &laquo_space;*pointerToVariable &laquo_space;endl &laquo_space;endl;

19
Q

Alap példaprogram pointerek működésének bemutatására: Integer érték megváltoztatása:

A

Integer érték megváltoztatása, pointer értékének kiiratása (nem változott, ugyanaz a memóriacím), a változó értékének kiiratása, amire a pointer mutat
(változott)
variable = 11; cout &laquo_space;“Address pointer pointerToVariable holds (pointerToVariable): “ &laquo_space;pointerToVariable &laquo_space;endl;
cout &laquo_space;“Content of the address pointer pointerToVariable holds (*pointerToVariable): “ &laquo_space;*pointerToVariable &laquo_space;endl &laquo_space;endl;

*pointerToVariable = 2;
cout << "Address of variable (&variable): " << &variable << endl;
cout << "Value of variable (variable): " << variable << endl << endl;
return 0; }
20
Q

A mutatók és a tömbök között milyen kapcsolat áll fenn? Minden művelet ami …

A

A C++ nyelvben a mutatók és a tömbök között szoros kapcsolat áll fenn. Minden művelet, ami tömbindexeléssel elvégezhető, mutatók segítségével szintén megvalósítható.

21
Q

Mit tudsz az egycsillagos pointerek, és az egydimenziós tömbök kapcsolatáról? Mit tudsz a többcsillagos pointerek, és a többdimenziós tömbök kapcsolatáról?

A

Az egydimenziós tömbök (vektorok) és az egyszeres indirektségű („egycsillagos”) mutatók között teljes a tartalmi és a formai analógia. A többdimenziós tömbök és a többszörös indirektségű („többcsillagos”) mutatók esetén ez a kapcsolat csak formai.

22
Q

honnan származik ez a vektorok és az egyszeres indirektségű mutatók között fennálló szoros kapcsolat? Definiálás.

A
Definiáljunk egy 5-elemű egész vektort!
int a[5];
A vektor elemei a memóriában adott címtől kezdve folytonosan helyezkednek el. Mindegyik elemre a[i] formában hivatkozhatunk (I.17. ábra). Vegyünk fel egy p, egészre mutató pointert, majd a „címe” operátor segítségével állítsuk az a tömb elejére (a 0. elemre)!
int *p;
p = &a[0];        vagy        p = a;
23
Q

honnan származik ez a vektorok és az egyszeres indirektségű mutatók között fennálló szoros kapcsolat!? mutató beállítása.

A

A mutató beállítására a tömb nevét is használhatjuk, hisz az is egy int * típusú mutató, csak éppen nem módosítható. (Fordítási hibához vezet azonban a p = &a; kifejezés, hisz ekkor a jobb oldal típusa int ()[5].) Ezek után, ha hivatkozunk a p mutató által kijelölt (p) változóra, akkor valójában az a[0] elemet érjük el.

24
Q

1.17-es ábra.

A

https://imgur.com/a/rO6keZP

25
Q

Mit tudsz a P mutató szerepéről?

A

teljesen megegyezik az a tömbnév szerepével, hisz mindkettő az elemek sorozatának kezdetét jelöli ki a memóriában. Lényeges különbség azonban a két mutató között, hogy míg a p mutató változó (tehát értéke tetszőlegesen módosítható), addig az a egy konstans értékű mutató, amelyet a fordító rögzít a memóriában.

26
Q

Hogyan jelölik a tömb i-edik elemét?

A
A tömb i-dik elemének címe:
 	&a[i]	&p[i]	a+i	p+i	 	 
 	A tömb 0-dik eleme:
 	a[0]	p[0]	*a	*p	*(a+0)	*(p+0)
 	A tömb i-dik eleme:
 	a[i]	p[i]	*(a+i)	*(p+i)
27
Q

Mit csinál a legtöbb c++ fordító?

A

az a[i] hivatkozásokat automatikusan (a+i) alakúra alakítja, majd ezt a pointeres alakot lefordítja. Az analógia azonban visszafelé is igaz, vagyis az indirektség () operátora helyett mindig használhatjuk az indexelés ([]) operátorát.