32Bit schieben.

Gast #4549554
Hallo,

ich will eine 32Bit Variable aus mehreren Werten zusammensetzen.

#define A 5
#define B 10
#define C 2
#define D 20
#define E 25

Nun soll der Integer folgendermaßen aufgebaut sein:

MSB
7 Bit für A
9 Bit für B
3 Bit für C
5 Bit für D
8 Bit für E
LSB

uint32_t variable = (((uint32_t)A << 25) | (((uint32_t)B << 16) | 
(((uint32_t)C << 13) | (((uint32_t)D << 8) | (uint32_t)E))));

Das ganze klappt bei mir aber nicht.

Ich habe versucht ohne A und B (also nur 16Bit)

uint32_t variable = ((C << 13) | ((D << 8) | E));

Das klappt...

Kann mir jemand sagen, was ich falsch mache? Nutze einen 8Bit AVR...
Atmega schrieb:
> uint32_t variable = (((uint32_t)A << 25) | (((uint32_t)B << 16) |
> (((uint32_t)C << 13) | (((uint32_t)D << 8) | (uint32_t)E))));

bevor ich Augenkrebs kriege würde ich mir da ein paar Klammern sparen

uint32_t variable = ((uint32_t)A << 25) | ((uint32_t)B << 16) |
                    ((uint32_t)C << 13) | ((uint32_t)D << 8)  | 
(uint32_t)E;

oder gleich
#define A 5UL
#define B 10UL
#define C 2UL
#define D 20UL
#define E 25UL

uint32_t variable = (A << 25) | (B << 16) |
                    (C << 13) | (D << 8)  | E;
(Firma: guloshop.de)
Für C gibt es Strukturen aus Bitfeldern (Variablenname mit Doppelpunkt 
und Bitanzahl dahinter -- wenn ich mich recht erinnere). Dann braucht 
man sich um solchen Kram normalerweise nicht mehr zu kümmern.

EDIT (Beispiel):
1
struct {
2
  uint32_t tag:5;
3
  uint32_t int monat:4;
4
  uint32_t int jahr:11;
5
  } wert;

Zugriff dann per wert.tag, wert.monat usw.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.