Verständnissfrage zu Verschiebeoperator
-
Guten Abend,
ich möchte in meine Anwendung in einem 32-Bitfeld (ist LPARAM) 2 Integerwerte speichern. Vom einen Wert (Zahl1) weiss ich daß er die Zahl (220-1) niemals übersteigt und vom anderen (Zahl2) weiss ich daß er nie größer als (210-1) wird. Jetzt hab ich mir gedacht ich benutze den Verschiebeoperator und habe mir drei Funktionen geschrieben, aber schon die erste crasht, was mache ich falsch, hier der code:
LPARAM Encode(int zahl1, int zahl2){ return (LPARAM)(zahl1 || (zahl2 <<= 10)); } int DecodeZahl1(LPARAM lParam){ return (int)( lParam >>= 10); } int DecodeZahl1(LPARAM lParam){ return (int)(lParam & 0x0FFFFF); }
Wer kann helfen, danke schon mal im voraus.
-
So müßte es richtig sein:
#include <stdio.h> int Encode(int zahl1, int zahl2){ return (int)(zahl1 | (zahl2 << 20)); } int DecodeZahl2(int lParam){ return (int)( lParam >> 20); } int DecodeZahl1(int lParam){ return (int)(lParam & 0x0FFFFF); } int main(void) { int a, b, c; a = 5; b = 10; c = Encode(a, b); printf("Zahl1: %x Zahl2: %x Zahl: %x\n", a, b, c); printf("Zahl: %x Zahl1: %x Zahl2: %x\n", c, DecodeZahl1(c), DecodeZahl2(c)); return 0; }
3 2 1 210987654321 09876543210987654321 | ZAHL2 | ZAHL1 |
D.h: die erste Zahl wird in den Bits 1..20 gespeichert und
die zweite in den Bits 21..32.Gruß mcr
-
Du bist mein Held, danke funktioniert super.
-
Nachgefragt: Wenn man in deinem Beispiel:
printf("Zahl: %x Zahl1: %x Zahl2: %x\n", c, DecodeZahl1(c), DecodeZahl2(c));
die Ausgabe so schreiben würde:
printf("Zahl: %x Zahl2: %x Zahl1: %x\n", c, DecodeZahl2(c), DecodeZahl1(c));
hätte man ein Problem oder? Durch die Verschiebnung in DecodeZahl2 die direkt auf c angewandt wird kann die Funktion DecodeZahl1 nicht mehr den korrekten Wert liefern oder irre ich mich da?
-
Du irrst dich da.
Die Argumente werden den Funktionen per call-by-value übergeben.
D.h. die Variablen der aufrufenden Funktion bleiben unberührt.Gruß mcr
-
Ah danke, wieder mal was gelernt.