Also es gibt ja diese Operatoren ">>" und "<<" nicht nur in pawn, was genau bringen die?
Habe mal was gehört von bit verschiebung oder so
Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!
Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
-
-
new
str_num = 3;
if(str_num << 2 == 24) return str_num = (~(3));Gibts auch im Beginner Tutorial von Sa-mp.com
-
Hat auch etwas mit Bitverschiebung / Bitflags zu tun.
Hab dazu schon mal was gepostet,ist aber wohl untergegangen im Thread.ZitatHab ich doch tatsächlich vergessen Gestern hier noch zu posten.
enum (<<= 1)
{
PLAYER_FLAG_GOD = 1,
PLAYER_FLAG_VIP, // 2
PLAYER_FLAG_MUTE, // 4
PLAYER_FLAG_INVISIBLE, // 8
PLAYER_FLAG_SPECTATED, // 16
PLAYER_FLAG_SPEEDO, // ...
PLAYER_FLAG_LOGGEDIN,
PLAYER_FLAG_LOGINCHECK,
PLAYER_FLAG_JAIL,
PLAYER_FLAG_REGISTERMSG,
PLAYER_FLAG_VTEXT,
PLAYER_FLAG_DRAWAVAILABLE,
PLAYER_FLAG_FREEZE,
PLAYER_FLAG_LOGINPANEL
};
// defined um es einfacher zu gestalten :-O
#define IsPlayerFlag(%0,%1) \
(PlayerInfo[%0][ibFlag] & (%1) )#define AddPlayerFlag(%0,%1) \
(PlayerInfo[%0][ibFlag] |= %1 )#define DeletePlayerFlag(%0,%1) \
(PlayerInfo[%0][ibFlag] &= ~%1 )#define ResetPlayerFlag(%0) \
(PlayerInfo[%0][ibFlag] = 0)
// AddPlayerFlag(playerid,PLAYER_FLAG_MUTE); bspSowas kann man bei vielen Sachen benutzen.
Ein gutes Beispiel wäre wohl ein Führerschein in einem Reallife-Script.
Anstatt sowas zu benutzten:
bool:HATAUTOFUEHRERSCHEIN[MAX_PLAYERS];
bool:HATMOTORRADFUEHRERSCHEIN[MAX_PLAYERS];
...
Kann man es anders regeln wie oben gezeigt.
enum (<<= 1)
{
LAPPEN_AUTO = 1,
LAPPEN_MOTORRAD,
LAPPEN_BOOT,
LAPPEN_FLUGZEUG
};
new ibFuehrerschein[MAX_PLAYERS];
Man müsste dann nur Abfragen ob das Bit gesetzt ist für einen bestimmten Führerschein.
if(ibFuehrerscehin[playerid] & LAPPEN_AUTO) { }
Spart einiges an Arbeit.Hab es selber auch so gemacht in einem angefangen Reallife-Script .Passt zwar nicht ganz hier in den Thread aber was solls :-O
Generell ist das ganze sehr nützlich wie Ich finde.Damit kann man sich einiges an Arbeit ersparen, natürlich nur wenn man auch wirklich weiss, wie es funktioniert.
new
str_num = 3;
if(str_num << 2 == 24) return str_num = (~(3));
3 << 2 ist aber 12 :-O!
-------
8 4 2 1
- - - - -
0 0 1 1 = 3
1 1 0 0 = 12 -
puh *schwitz* versteh ich immernoch nix von
-
Ist schwer zu erklären, glaube auch nicht,dass Ich 100% darüber bescheid weiss.
Du solltest jedenfalls schon ein wenig über das Dualsystemwissen, um die ganze Bitverschiebung / setzung usw zu verstehen.Wenn ich Zeit finde post Ich vllt eine kurze Anleitung.Eventuell könnte aber irgendjemand anderes dir einen Crash-Kurs darin geben ;).
-
Danke...
Das mit dem Dualsystem versteh ich schon, aber noch nicht so ganz, was nun "verschoben" wird ... -
Zitat
3 << 2 ist aber 12 :-O!
-------
8 4 2 1
- - - - -
0 0 1 1 = 3
0 1 1 0 = 6
1 1 0 0 = 12
Da du ja weisst wie das Dualsystem funktioniert,brauch ich wohl 8 - 4 - 2 - 1 nicht erklären.Würde eigentlich noch viel weiter gehen bis es 32 Stellen sind.0011 im Dualsystem ist die 3.Wenn mann jetzt die 0011 um 2 nach links verschiebt ( << 2 ) erhält man 1100 ( 12 ).
Hätte man jetzt um 1 verschoben ( << 1 ) wäre es demnach 0110 ( 6 ).
Generell werden einfach die 0 und 1 im Dualsystem gesehen verschoben.
Klick mich
Das Bild zeigt die Bitverschiebung nach links um 1 ( << 1 ). -
aaah ok so langsam fang ich an es zu blicken danke
-
hat das dualsystem was mit dem zweierkomplement zu tun?
-
Ja, mit der Zweierpotenz
Das Komplement wird verwendet, um negative Zahlen darzustellen
Beispiel: 1 Byte (dargestellt ist eine 1)
00000001
Komplement: 11111110 + 1 = 11111111 = -1 (dezimal) -
aaah ok so langsam fang ich an es zu blicken danke
Ist ja gut.Dann wird es auch nicht ganz so schwer sein,das Script oben halbwegs zu verstehen.ZitatPLAYER_FLAG_GOD = 1,
PLAYER_FLAG_VIP, // 2
PLAYER_FLAG_MUTE, // 4
PLAYER_FLAG_INVISIBLE, // 8
PLAYER_FLAG_SPECTATED, // 16
16 8 4 2 1 - Wenn du jetzt weisst welche Bit für was steht,kannst du so auch daraus auf einiges schließen.1 0 1 0 0 - 16 und 4 sind gesetz,würde also heißen PLAYER_FLAG_SPECTATED und PLAYER_FLAG_MUTE
1 1 1 0 1 - 16, 8,4 und 1 sind gestzt.Folgt also das _:GOD,MUTE,INVISIBLE und SPECTATEDAbfragen dazu macht man dann mit Bitwise-And ( Nennt man glaub ich so )
#define IsPlayerFlag(%0,%1) \
(PlayerInfo[%0][ibFlag] & (%1) )
Falls du mehr wissen willst,sag bescheid.Kann ja nicht schaden wenn mehr Leute damit anfangen auch so zu scripten,da es in meinen Augen mehr Vorteile hat.
Bspw auch Teams.
Man kann dann sagen der Spieler ist in TEAM_XY und TEAM_ADMIN ( Godfather eventuell ) ohne einen riesen Umstände. -
da oben scheiter ich schon beim
enum (<<= 1)
ich dachte man muss da nen namen hinschreiben... xD -
Hier bei brauch oder kann man das auch überhaupt nicht.
Das (<<= 1) bedeutet,dass für jeden folgenden Eintrag der Wert um 1 Bitweise verschoben wird.ZitatPLAYER_FLAG_GOD = 1,
PLAYER_FLAG_VIP, // 2
PLAYER_FLAG_MUTE, // 4
Weil PLAYER_FLAG_GOD 1 ist,wird der nächste um 1 nach Links verschoben.
000000001 ( << 1 ) [ Ist ja der Wert 1 ]
--> daraus folgt :
000000010Geht dann immer so weiter.
Das ganze findet man aber auch mehr oder weniger im SA:MP Forum,Klick
Du hättest es aber auch anstatt mit einem Enum so machen können
#define PLAYER_FLAG_GOD ( 1 << 0 )
#define PLAYER_FLAG_VIP ( 1 << 1 )
#define PLAYER_FLAG_MUTE ( 1 << 2 )
...
Oh man,dass verwirrt dich jetzt bestimmt xD -
doch danke ich versteh wie das funktioniert...
PLAYER_FLAG_GOD = 1, //ist 1
PLAYER_FLAG_VIP, // ist 2 weil es um 1 ge<< wird
PLAYER_FLAG_MUTE, // ist 4 weil es um 2 ge<< wird
#define PLAYER_FLAG_GOD ( 1 << 0 ) //ist 1 (<<0 bringt nix)
#define PLAYER_FLAG_VIP ( 1 << 1 ) // ist 2 weil es um 1 ge<< wird
#define PLAYER_FLAG_MUTE ( 1 << 2 ) // ist 4 weil es um 2 ge<< wirdoder? -
doch danke ich versteh wie das funktioniert...
PLAYER_FLAG_GOD = 1, //ist 1
PLAYER_FLAG_VIP, // ist 2 weil es um 1 ge<< wird
PLAYER_FLAG_MUTE, // ist 4 weil es um 2 ge<< wird
Aber auch nur bei
enum (<<= 1)
Bei
enum (<<= 2)
wäre es Anders.Da wäre es 1 , 4 ,16 ,da man ja jeweil um 2 Verschiebt.
0000001 - 1
0000100 - 4
0010000 - 16 -
breadfish.de
Hat das Thema geschlossen.