Byte in Bit's zerlegen in C

Gast #313381
Lesenswert?
• ▲
▼
wenn du es entweder als byte oder als einzelne bits ansprechen willst,
mach es mit einer union:

struct bit_def {
        char    b0:1;
        char    b1:1;
        char    b2:1;
        char    b3:1;
        char    b4:1;
        char    b5:1;
        char    b6:1;
        char    b7:1;
};
union byte_def{
    struct bit_def bit;
    char    byte;
};

habe ich nur schnell aus meiner register.inc gezogen, am besten
googelst du noch mal nach union und structure...

mfg
OP #313383
Lesenswert?
• ▲
▼
@All
Also nochmal etwas genauer, ich habe ein Byte und möchte die 8
einzelbits in eine Struktur bringen so das ich auf jedes Einzelbit
dirket zugreifen kann. Ich habe mir so etwas wie ein Array vorgestellt,
wo alle Bits von 0-7 abliegen z.B. BIT[0..7].


@Marcus
Das sieht echt gut aus, ich weiss nur nicht ob das so für mich
anwendbar ist. Das mit dem char verwirrt mich ein wenig.
Ich habe das Byte nämlich als INT vorliegen.
Gast #313384
Lesenswert?
• ▲
▼
char    bX:1; gibt dir an, das du das X'te bit (deswegen die 1 danach)
innerhalb eines char wertes einzeln ansprichst.


hier ein beispiel für 16bit, ebenfalls aus der sfr.h meines
controllers:

union{
    struct{
        char    ide15:1;           /* for Slot15 */
        char    ide14:1;           /* for Slot14 */
        char    ide13:1;           /* for Slot13 */
        char    ide12:1;           /* for Slot12 */
        char    ide11:1;           /* for Slot11 */
        char    ide10:1;           /* for Slot10 */
        char    ide9:1;            /* for Slot9 */
        char    ide8:1;            /* for Slot8 */
        char    ide7:1;            /* for Slot7 */
        char    ide6:1;            /* for Slot6 */
        char    ide5:1;            /* for Slot5 */
        char    ide4:1;            /* for Slot4 */
        char    ide3:1;            /* for Slot3 */
        char    ide2:1;            /* for Slot2 */
        char    ide1:1;            /* for Slot1 */
        char    ide0:1;            /* for Slot0 */
    }b;
    struct{
        char    low;                /* Low  8 bit */
        char    high;               /* High 8 bit */
    }byte;
    unsigned short  word;
}c0idr_addr, c1idr_addr;


hier siehst du auch noch die unterteilung in das high und das low byte
eines integer wertes...
du kannst also das wort, das high oder low byte oder jedes bit einzeln
ansprechen.
Gast #313386
Lesenswert?
• ▲
▼
bei den beiden obigen variablen c0idr_addr und c1idr_addr ginge es
folgendermaßen:


bit zugriff:

c0idr_addr.b.idrX = 1...0;  (X von 0...15, je nachdem welches bit du
haben willst)


byte zugriff:

c0idr_addr.byte.X = 0x00...0xFF; (X low oder high)


word zugriff:

c0idr_addr.word = 0x0000...0xFFFF;



mfg, Marcus
Gast #313388
Lesenswert?
• ▲
▼
ähm... nein... wenn dann würde es so gehen

...
   c0idr_addr.b.idr[i] = 1;
...

zumindest würde es bei einem array so gehen, aber bei einer variablen
gehts so glaube auch nicht.
befürchte das musst du alles per hand erledigen...

...hab grad noch mal nachgehört... ist wohl compiler-sache, obs klappt
oder nicht... was der dann da für einen code draus macht steht wieder
auf einem anderen blatt...

vllt. weiss jemand anderes ja genaueres...?
Gast #313393
Lesenswert?
• ▲
▼
Hallo zusammen,

ich weiß ja nicht, was Du mit den einzelnen Bits anfangen willst.
Denkbar wäre folgende Abfrage:

// Bit 0 ist gesetzt
if (byte_xyz & 0x01) {
}

// Bit 0 ist nicht gesetzt
if ((byte_xyz & 0x01) == 0) {
}

Als Abfragewerte mußt Du 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40 und
0x80 einsetzen und schon sind alle 8 Bits abgefragt. Funktioniert auch
mit 16-Bit-Werten.

Dirk
Gast #313394
Lesenswert?
• ▲
▼
@sascha :

ich würde es so machen :

bit prüfen :

  ((wert >> bitnummer) & 1)  // ergibt 0 oder 1

bit setzen :

  wert = wert | (1 << bitnummer)

bit löschen

  wert = wert & ~ (1 << bitnummer)

dann brauchst du keine struct/union und kannst den code überall laufen
lassen. deine bitnummer läuft dann von 0 - 7 (bei einem byte) und von 0
- 16 bei einem integer wert
hoffe ich konnte dir etwas helfen

gruß
rene

Antwort schreiben

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.

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.