32Bit schieben.

Gast #4549554
Lesenswert?
• ▲
▼
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...
#4549637
Lesenswert?
• ▲
▼
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) #4549643
Lesenswert?
• ▲
▼
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren