-
        

Ergebnis 1 bis 4 von 4

Thema: Bitweises Verschieben

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    17.05.2006
    Beiträge
    23

    Bitweises Verschieben

    Anzeige

    Hallo Leute, ich denke ich hab ein Brett vorm Kopf, aber ich Suche jemanden, der mir das Brett wegnimmt - also hier das "Problem":

    Der Code war zuerst folgender:
    Code:
    uint8_t keys_state=0;
    	
    //Tasten liegen an PINA4-7 und sind active low
    keys_state = ~PINA >> 4;
    Die Eingabe für PINA ist 0b11111111, weil alle 4 Tasten nicht gedrückt sind und die anderen Pins auch high sind. Das Ergebnis war (für mich zuerst überraschend) 0b11110000.
    Dann hab ich mir gedacht, dass er das µC Register vielleicht als signed int interpretiert und deshalb mit dem vermeintlichen Vorzeichenbit und nicht mit Nullen auffüllt, was das Ergebnis erklären würde.

    Daher der neue Code:
    Code:
    uint8_t keys_state=0;
    	
    //Tasten liegen an PINA4-7 und sind active low
    keys_state = PINA;
    keys_state = ~keys_state >> 4;
    Nun sollte er keys_state als unsigned int mit Nullen auffüllen...tut er aber nicht. Mögliche Erklärung: Er verschiebt erst und invertiert dann, aber laut Docs hat der ~ Operator eine höhere Priorität als der >> Operator. Auch eine Klammer um das ~keys_state führt nicht zum gewünschten Ergebnis.

    Was allerdings funktioniert ist folgendes:
    Code:
    uint8_t keys_state=0;
    	
    //Tasten liegen an PINA4-7 und sind active low
    keys_state = PINA;
    keys_state = ~keys_state;
    keys_state = keys_state >> 4;
    Zerlegt man die Aktion in zwei einzelne (was ja nach der Priorität sowieso passieren sollte), bringt er das gewünschte Ergebnis (0b00000000)


    Wo ist mein Denkfehler?

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Setz doch eine Klammer
    result = (~wert) >> shift;
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    17.05.2006
    Beiträge
    23

    Re: Bitweises Verschieben

    Ich zitier mich mal selbst:

    Zitat Zitat von Quincy
    Auch eine Klammer um das ~keys_state führt nicht zum gewünschten Ergebnis.

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Die Klammer tut nichts zur Sache...

    Bei der verschachtelten Operation wird innen auf int-Ebene ausgewertet. Die genaue Semantik kannst du der C-Spezifikation entnehmen.

    Die Zeile ist NICHT gleichbedeutend mit der Aufspaltung in einzelne Zuweisungen!

    Wenn du es in einer Zeile haben willst, geht

    bar = ((uint8_t) ~foo) >> 4;
    Disclaimer: none. Sue me.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •