Forum: Compiler & IDEs Bitarray shiften / Problem


von Sebastian (Gast)


Lesenswert?

Hallo,

ich habe einen 16Bit-Parameter, der so aufgebaut ist:

1101 100a aabb bbcc

Um nun besser experimentieren zu können, habe ich folgende Definitionen 
eingeführt:

#define Param_a 110
#define Param_b 0001
#define Param_c 01
#define Param (0b1101100000000000 | (Param_a << 8) | (Param_b << 5) | 
(Param_c << 1))

Das Problem, das ich nun habe, ist, dass der Compiler die Parameter, die 
nicht mit einer 1 beginnen, natürlich "verkürzt". Aus "0001" wird "1" 
und damit passt der Shift nach links natürlich nicht mehr.

Wie kann ich also meine Teil-Bitfelder richtig shiften? Überall eine 1 
davor und die dann abschneiden ist ja auch nicht die eleganteste 
Lösung...

Vielen Dank im voraus!

Sebastian

von amber (Gast)


Lesenswert?

Hmmm irgendwie ist das letzte #define doch irgendwie komisch bzw. ich 
weiss nicht was du machen willst...

0b 1101 1000 0000 0000

Ich behaupt mal, wenn du jetzt aus dem Parameter die "ersten" 3 Bit 
ausmaskieren willst, dann veroder das mit : (Param_a << 13)
Für das 4te Bit shiftest du dann halt : (Param_b << 12) und veroderst.

So müsste das ausmaskieren klappen...ansonsten bissle probieren...

von Falk B. (falk)


Lesenswert?

Da wird nix gekürzt, das passt so schon. Aber deine Shift sind falsch. 
Eher so.
1
#define Param (0b1101100000000000 | (Param_a << 6) | (Param_b << 1) |
2
(Param_c << 0))

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Falk Brunner schrieb:
> Da wird nix gekürzt, das passt so schon. Aber deine Shift sind falsch.
> Eher so.
>
>
1
> #define Param (0b1101100000000000 | (Param_a << 6) | (Param_b << 1) |
2
> (Param_c << 0))
3
>

h.h. bei der Berechnung des Shift-Offsets orientierst du dich am 
untersten Bit 0 ganr rechts, nicht am jeweils oberen Bit.

Johann

von Sven P. (Gast)


Lesenswert?

Sebastian schrieb:
> #define Param_a 110
> #define Param_b 0001
> #define Param_c 01

Da würde ich nochmal drüber nachdenken.

von Sebastian (Gast)


Lesenswert?

Hallo,

vielen Dank zuerst einmal für die schnellen Antworten!

Falk hat vollkommen recht, ich habe mich oberen statt unteren Bit 
orientiert, schön blöde... nun funktioniert alles einwandfrei!

Sven, Du hast auch recht, es muss natürlich

#define Param_a 0b110
#define Param_b 0b0001
#define Param_c 0b01

heißen. Das hatte ich aber schon richtig, hier aber falsch gepostet...

Viele Grüße und nochmals vielen Dank! :-)

Sebastian

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.