Forum: Compiler & IDEs Bitketten zusammenführen


von entropie (Gast)


Lesenswert?

Hallo zusammen,

folgende Frage zu folgendem Code:
1
typedef struct 
2
{ 
3
  uint8_t anfang: 4;
4
  uint8_t ende: 4;
5
} test_t;
6
7
test_t test;
8
9
test.anfang = 0x8;
10
test.ende = 5;
11
12
PORTB = (test.anfang << 4) | (test.ende << 4);

Die gewünschte Ausgabe an PORTB ist dabei: 0b10001010

Funktioniert das so ?
Vielen Dank für eure Hilfe.

Gruß,
Olli

von icke (Gast)


Lesenswert?

nein.
Du darfst test.ende nicht um 4 shiften.

von icke (Gast)


Lesenswert?

und vielleicht test.anfang<<4 als uint8_t casten

von Falk B. (falk)


Lesenswert?

@ entropie (Gast)

>Funktioniert das so ?

Nö. Siehe Bitmanipulation.

Du musst die unteren 4 Bits maskieren, die oberen schieben, die 
Maskierung ergibt sich hier automatisch.

PORTB = (test.ende << 4) | (test.anfang & 0x0F);

von Peter II (Gast)


Lesenswert?

icke schrieb:
> ein.
> Du darfst test.ende nicht um 4 shiften.

warum nicht. C legt doch fest das jeden Operation mindestens mit int zu 
erfolgen hat. Also muss der compiler test.ende auf 16bit anheben. Das 
sollte eigentlich funktionieren.

von entropie (Gast)


Lesenswert?

Super danke, wieder was gelernt :)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Peter II schrieb:
> icke schrieb:
>> Du darfst test.ende nicht um 4 shiften.
>
> warum nicht. [...]

Dürfen darf man alles. Es ist aber hier nicht sinnvoll, test.ende ebenso 
zu shiften wie test.anfang. Die Bits von test.ende sollen doch im 
unteren Nibble verbleiben.

von Karl H. (kbuchegg)


Lesenswert?

Und wenn du in der Struct einfach die Member vertauschen würdest, 
bräuchtest du überhaupt nichts shiften, weil dann die Bits bereits in 
der richtigen Reihenfolge im Byte angeordnet sind, so dass man eine 
derartige Variable einfach auf den Port legt und bereits alles richtig 
an seinem Platz ist.

von entropie (Gast)


Lesenswert?

ah super vielen dank !

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.