PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bitweises Verschieben



Quincy
24.05.2006, 01:46
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:

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:

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:

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?

PicNick
24.05.2006, 07:37
Setz doch eine Klammer
result = (~wert) >> shift;

Quincy
24.05.2006, 15:29
Ich zitier mich mal selbst:


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

SprinterSB
24.05.2006, 15:45
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;