hlmod.hu
https://hlmod.hu/

read_argv, equal, equali , && & (1>>3) ??
https://hlmod.hu/viewtopic.php?f=10&t=28270
Oldal: 1 / 1

Szerző:  The Peace [ 2017.09.24. 18:33 ]
Hozzászólás témája:  read_argv, equal, equali , && & (1>>3) ??

Sziasztok!

Amit fent említettem a TÉMA NÉV-ben read_argv , equal , equali , && - & használata , (1>>3) , Nos ezekkel az a kérdésem hogy mire is funkcionálnak. mikor használunk && -t vagy csak simán &-t , definálva láttam ezt az (1>>3)-t az mit jelent, az equal és az equali miben másabb, a read_argv (arg) ezeket mire használják?

Aki segít megy a köszönöm (lehet jó részletes leírás is!)

Szerző:  fear_ezmegmi [ 2017.09.24. 18:51 ]
Hozzászólás témája:  Re: read_argv, equal, equali , && & (1>>3) ??

equal, equali -> megnézi hogy két string egyenlő-e annyi különbség van a kettő között hogy az equali az nem veszi figyelembe a kicsi -és nagy betű közötti különbséget

&& <- ifben szokás használni és az 'ÉS'-t jelenti, magyarul mindkét oldalt igaznak kell lennie a feltételnek hogy tovább fusson
Van egy hasznos táblázat hozzá:
false && true -> false
false && false - > false
true && false -> false
true && true -> true
Pl: if(1 == 0) -> false
if(1 == 1) -> true és belép a magba

read_argv -> client_command paramétereit lehet beolvasni

a 3>>1 és a & pedig a bittenkénti eltoláshoz tartozik, arról van Metalnak egy leírása valahol fórumon
EDIT: viewtopic.php?f=55&t=3461 ez sokat fog segíteni

Szerző:  fear_ezmegmi [ 2017.09.24. 20:57 ]
Hozzászólás témája:  Re: read_argv, equal, equali , && & (1>>3) ??

Tudom hogy dupla poszt, de így átláthatóbb.
Néhány példa a bit használatra: (https://forums.alliedmods.net/showthread.php?t=139916 alapján)

ugye általában ha tárolni akarjuk mondjuk, hogy ki admin akkor legtöbbször tömböt használunk
Kód:
new bool:g_bAdmin[33];
public client_putinserver(playerid)
{
   if(is_user_admin(playerid)) g_bAdmin[playerid] = true;
}
public client_disconnect(playerid)
{
   g_bAdmin[playerid] = false;
}

Viszont ez 33*4 byte vagyis 132 byte memóriát használna fel, elég sok egy egyszerű kis booleanhoz nem?
Itt jönnek képbe a bittenkénti operációk

ugyanez a plugin így nézne ki:
Kód:
new g_bAdmin;

public client_putinserver(playerid)
{
   if(is_user_admin(playerid))
      g_bAdmin |= (1 << (id & 31));
}

Na mi is történik itt?
Először is tudni érdemes hogy 4 byte az 32 bitet képes eltárolni (ugye 1 byte = 8 bit)
A játékban a játékos IDk 1től 32ig vannak számozva ezért nem csinálhatunk szimplán 1 << 32t hiszen ha 32vel eltoljuk akkor túlcsordulunk, ezért egy kis trükköt használunk. az id & 31 alapvetőleg a játékosIDjét fogja visszaadni kivéve ha az 32 mert 32&31 = 0, tehát 1től 31ig a rendes számot fogja visszaadni 32nél pedig 0át így pedig tökéletesen elfogunk tudni tárolni mindent ami nekünk kell.

Tehát az 1es értéket (true) eltoljuk mindig a játékos IDvel így maximális slot esetén is kihasználva minden helyet.

Kód:
public client_disconnect( id )
{
    g_bAdmin &= ~( 1 << ( id & 31 ) );
}

Itt pedig egyszerűen ahol ha 1 volt az IDnél akkor 0ra állítjuk majd pedig egy & bit operációval kivonjuk
vagyis:
0000 0000 0000 0000 0000 0000 0100 0100 1 << (id & 31) id = 2
1111 1111 1111 1111 1111 1111 1111 1000 ~(1 << (id & 31))
0000 0000 0000 0000 0000 0000 0100 0000 & ~(1 << (id & 31))
Az elején a 2es és a 6os IDnek volt adminja, így pedig már csak a 6osnak van.

Kód:
if ( g_bAdmin )
ez igazzal tér vissza ha bármelyik helyen van 1es

Másik példa:

van egy változónk amiben fegyvereket tárolunk, jelen esetben hogy azok a fegyverek engedélyezettek-e.
Kód:
new g_weapons;
g_Weapons = ( 1 << CSW_SG550 ) | ( 1 << CSW_AWP ) | ( 1 << CSW_G3SG1 );

eltároljuk az előbb megismert módszerrel őket, majd ha tiltani szeretnénk őket akkor egyszerűen le lehet kérdezni hogy a tiltottak között van-e a fegyver
Kód:
if ( g_Weapons & ( 1 << CSW_AWP ) )

Szerző:  The Peace [ 2017.09.27. 15:24 ]
Hozzászólás témája:  Re: read_argv, equal, equali , && & (1>>3) ??

Ment a köszönöm, még értelmezgetem tényleg köszönö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/