hlmod.hu https://hlmod.hu/ |
|
[TUT] Bitműveletek https://hlmod.hu/viewtopic.php?f=14&t=23135 |
Oldal: 1 / 1 |
Szerző: | Akosch:. [2015.12.23. 15:15 ] |
Hozzászólás témája: | [TUT] Bitműveletek |
Sziasztok, Gondoltam ismét készülök nektek valami újdonsággal ![]() Mire is jók ezek? Ezek az operátorok lehetőséget adnak, hogy az egész számok bitjeit külön - külön tudjuk kezelni, ki - be "kapcsolni". Ezek megértéséhez jól jön, ha tisztában vagyunk a kettes ( bináris ) számrendszerrel, nem kell mindent tudni, de az azért nem árt, ha tudod, hogy csak a 0 és az 1 létezik, mint számjegy ebben a számrendszerben és hogy bármennyi nullát tolunk egy szám elé az nem változtatja az értékét. ( 0001 = 000001 = 1 ) Ha kicsit visszagondolsz a matekórákra rögtön beugorhat, hogy miért is van így, 0 * 2^10 meg 0 * 2^20 még mindig csak 0 lesz ![]() Bitek a pawnban Mint tudjuk a mi kis pawnnunkban nincs nagyon típusosság, és minden változó 4 bájtot azaz 32 bitet foglal le magának ( Ebből jön, hogy a pawn egy 32 bites programozási nyelv. ). Azonban fontos lehet még megemlíteni, hogy ezek előjeles egész változók ( signed integers ) ami annyit takar, hogy minden változó fent tart 1 bitet a 32-ből ami jelöli, hogy pozitív vagy negatív szám ( Ezt a bitet szokták MSB-nek hívni ). Illetve azt is érdemes tudni, hogy a pawn 2-es komplementer rendszert használ, hogy előállítsa a negatív számokat, ez annyiból áll, hogy vesszük az egész, pozitív számot, majd minden bitjét kicseréljük az ellentétére és utána még hozzáadunk egyet, és meg is lenne a negatív szám. Példa: Kód: 00000000000000000000000000000001 // 1 Operátorok, műveletek Most pedig szépen nézzük végig mi áll rendelkezésünkre: 1. Bitenkénti ( bitek közötti ) ÉS A bitenkénti ÉS művelet ( AND, & ) egy logikai operátor, ami csak akkor ad vissza 1-t , ha mindkét bit 1. Fontos, hogy nem egyezik meg a "&&" logikai operátorral. Igazság táblázata ( 2 ábrázolás, kinek hogy... ): Kód: & 0 1 Kód: A B A&B Példa ( baloldalon bináris számrendszerben, ahogy a memóriában van, jobbon decimálisban ): Kód: 00000000000000000000000000001011 // 11 2. Bitenkénti ( bitek közötti ) VAGY A bitenkénti VAGY művelet ( OR, | ) egy logikai operátor, ami mindig 1 -t ad vissza, kivéve, ha mindkét bit 0. Fontos, hogy nem összekeverendő a "||" logikai operátorral. Igazság táblázata: Kód: | 0 1 Kód: A B A|B Példa: Kód: 00000000000000000000000000001011 // 11 3. Bitenkénti ( bitek közötti ) KIZÁRÓ VAGY A bitenkénti KIZÁRÓ VAGY művelet ( XOR, ^ ) egy logikai operátor, ami mindig 1 -t ad vissza, ha különbözik a két bit. Igazság táblázata: Kód: ^ 0 1 Kód: A B A^B Példa: Kód: 00000000000000000000000000001011 // 11 4. Bitenkénti ( bitek közötti ) NEGÁLÁS A bitenkénti NEGÁLÁS ( NOT, ~ ) egy logikai operátor, ami eltér az előbbiektől, mivel 2 helyett csak 1 bitre alkalmazzuk. Az 1-kből 0-t a 0-kból 1-t csinál. Igazság táblázata: Kód: A~A Példa: Kód: ~00000000000000000000000000001111 // 15 5. Biteltolás ( shiftelés ) operátorok A shift operátorok ( <<, >> ) a bitek tologatására szolgálnak. A << balra tol, a >> jobbra ( amerre mutatnak a nyilak ). Az operátor előtt ( bal oldalt ) szereplő szám az amit eltolunk, és az operátor után ( jobb oldalt ) lévő pedig, hogy mennyivel. Jobbra tolás ( >> ): Pozitív számmal: Kód: 00000000000000000000000000001100 // 12 Láthatjuk, hogy csak minden bit hátrébb került illetve az "üres" helyekre 0-k kerültek. Negatív számmal: Kód: 11111111111111111111111111111000 // -8 Itt már látni, hogy szerepe van az MSB -nek, most 1-k kerültek az "üres" helyekre. Balra tolás ( << ): Pozitív számmal: Kód: 00000000000000000000000000000100 // 4 Ismét 0-kal egészül ki a szám, azonban itt már figyelni kell, ha túl sokáig shiftelünk egy pozitív számot akkor abból a túlcsordulás előtt ( Balról az első bit az MSB, ha az 1 lesz onnantól negatív a számunk. ) egy negatív szám lesz, túlcsordulásnál pedig a 0 -t veszi fel értékként. Negatív számmal: Kód: 11111111111111111111111111111000 // -8 Láthatjuk, hogy itt megint balra shiftelésnél mindig 0-kal egészül ki a szám, legyen az pozitív vagy negatív. Azonban, ha túl sokat toljuk, akkor előfordulhat, hogy a szám elveszíti a negatív értéket és 0 lesz. 6. Logikai biteltolás ( logikai shiftelés ) operátor A logikai shiftelésből csak egy létezik, mégpedig a jobbra logikai shiftelés ( >>> ). Sokban hasonlít a jobbra shiftelő operátorra ( >> ), azonban van egy fontos különbség. Nézzük is példákkal: Kód: 00000000000000000000000000010000 // 16 Itt még nem látni semmi különlegeset, ugyanaz, mint a jobbra shiftelés( >> ). Negatív számmal: Kód: 11111111111111111111111111111000 // -8 Itt már látszik a különbség, logikai shiftelésnél nem számít az MSB értéke, mindig 0 kerül az üresedő helyekre, emiatt sose kaphatunk negatív eredményt. Na, akkor itt lenne az elméleti rész vége. Őszintén nekem a felhasználásukra amxmdox -en belül nincs más ötletem, csak, hogy logikai változók helyett használjunk bitműveleteket, így memóriát spórolva. Hogyan lehetséges ez? A bit műveletek segítségével tudjuk a változó bitjeit külön - külön kezelni, mint már említettem feljebb, és egy bit lehet 0 vagy 1, ergo egy változóban lehetőségünk van 32 igaz - hamis érték tárolására. Egy példa kód, ha a játékos be van vakítva, és megöl közbe valakit kiírja, hogy "TE CSALOOO, WH-s!":
Felmerülhet sokakban a kérdés, hogy az 1 -t miért ( JátékosID & 31 )-el shifteljuk. Gondoljunk vissza kicsit, ha 32 biten 32-vel ( maximum játékos id ) tolnánk akkor az adatvesztéssel járna, kicsúszna a változóból amit bele akarunk tenni. Ezért van szükség egy kis trükre, nézzük csak mi lesz az eredménye a 32 & 31 -nek: 0. Miért jó ez nekünk? Mert a játékos azonosítók 1-től 32-ig tartanak, szóval a 0 szabad, és shiftelésnél se okoz gondot ( 1 << 0 = 1 ), szóval befér még a 32. játékos dolga is a változónkba. Pár makró, apróság ehhez:
Végül pedig szeretném megemlíteni, hogy honnan szedtem az infókat a tutoriálhoz: Anthony - Bitműveletek, valamint gyakorlati alkalmazás a SA:MP-ban( főleg innen, nagyon szép összeszedett tut ) Bugsy - [TUT] Bits, Bit-fields, and Bit-wise Operators Véleményeket várom, ha lenne valami jó ötletetek a használatukra akkor azt is szívesen látnám ![]() |
Oldal: 1 / 1 | Minden időpont UTC+02:00 időzóna szerinti |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |