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
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...
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)) |
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
Sebastian schrieb: > #define Param_a 110 > #define Param_b 0001 > #define Param_c 01 Da würde ich nochmal drüber nachdenken.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.