Forum: Mikrocontroller und Digitale Elektronik Bitoperationen mit Strukturen


von Taylor (Gast)


Lesenswert?

Hi,
mein Problem ist zwar nicht AVR-Speziell aber vielleicht kann mir ja
doch wer hier helfen.
Und zwar möchte ich zwei 16-Bit Strukturen mit einander vergleiche und
auswerten.
Dazu möchte ich sie gern zum Beispiel "verunden". Wie sieht dabei
meine Syntax aus ?
Wenn ich die komplette Struktur mit einem Hex Wert vergleichen will
mach ich es so, dass ich einen 16 Bit Zeiger darauf lege.

*((u16*)&Struktur_A) == 0x80

Die Bitstrukturen habe ich vorher definiert.

So, wie kann ich nun zb Struktur_A mit Struktur_B verunden und das
ergebnis dann einer Struktur_C zuweisen. Bzw, kann man überhaupt in
eine Bitstruktur direkt einen Wert einprägen ??

gruß Taylor

von Stefan B. (Gast)


Lesenswert?

Hallo Taylor!

Was ist eine 16-Bit Struktur bzw. was verstehst Du darunter?

also allgemein in C würde das für Variablen mit einem einfachen &
aussehen, also:

   VarC = VarA & VarB;

wobei VarA, VarB und VarC die Variablen sind.

Ich hoffe Dir damit weitergeholfen zu haben!

Stefan B.

von Taylor (Gast)


Lesenswert?

Hi, ja bei Variablen ist das klar, nur ich bruache das bezogen auf
Bitstrukturen.
Die Struktur sieht dann so aus:

typedef struct
{
 u16 Wert1: 1;
 u16 Wert2: 1;
 u16 Wert3: 1;
 u16 Wert4: 1;
 ... usw
}TypStruktur

Bei der Deklaration dann so:

Typstruktur Struktur_A, Struktur_B, Struktur_C;

Nun möchte ich die Strukturen_A und _B verunden und die dann Struktur_C
zuweisen.

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

Der einfachste Weg dazu wird die sogenannte 'union' sein.

Beispiel:
1
#include <stdio.h>
2
3
typedef struct bitfield_s
4
{
5
        unsigned flag1:1;
6
        unsigned flag2:1;
7
        unsigned flag3:1;
8
        unsigned flag4:1;
9
        unsigned flag5:1;
10
        unsigned flag6:1;
11
        unsigned flag7:1;
12
} bitfield_t;
13
14
typedef union bitsnbytes_u
15
{
16
        unsigned int val;
17
        bitfield_t bits;
18
} bitsnbytes_t;
19
20
bitsnbytes_t structA, structB, structC;
21
22
int
23
main(void)
24
{
25
        structA.bits.flag1 = 1;
26
        structB.bits.flag2 = 1;
27
28
        structC.val = structA.val | structB.val;
29
30
        printf("structC.val = %d\n", structC.val);
31
32
        return 0;
33
}

von Marcus (Gast)


Lesenswert?

stimmt... mit union legst du fest, das es entweder die eine, oder die
andere struktur sein kann (also der komplette wert der
struktur/variablen angesprochen wird oder halt eben bitweise).
so kannst du mit .val die komplette struktur vergleichen und mit .flagX
bitweise drauf zugreifen.

von Taylor (Gast)


Lesenswert?

Danke,
werd ich gleich mal probieren. Super Forum hier.
Wahnsinn wie schnell man hier ne hilfreiche Antwort bekommt.

gruß Taylor

von Taylor (Gast)


Lesenswert?

Super,
klappt genau so wie ich es haben wollte. Besten Dank

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.