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.


Anmelden zum Antworten