www.mikrocontroller.net

Forum: Compiler & IDEs Bitarray shiften / Problem


Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: amber (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Falk Brunner (falk)
Datum:

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

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

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

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

Johann

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian schrieb:
> #define Param_a 110
> #define Param_b 0001
> #define Param_c 01

Da würde ich nochmal drüber nachdenken.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.