Forum: Mikrocontroller und Digitale Elektronik Byte in Bit's zerlegen in C


von Sascha D. (plutoonline)


Lesenswert?

Hallo, ich stehe ma wieder voll auf dem schlauch, kann mir jemand einen
denkanstoß geben wie ich ein Byte in Bits zerlegen kann.
Oder gibt es da in C vielleicht sogar eine fertig routine?

Danke schonmal!!!!

von Alban (Gast)


Lesenswert?

Hilft das ein wenig:

http://www.mikrocontroller.net/articles/Bit_manipulation

Wenn nicht, schreib doch mal was du genau willst. Willst du wissen ob
ein Bit gesetzt ist oder must du Bits umsortieren.

von Marcus (Gast)


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

von Profi (Gast)


Lesenswert?


von Sascha D. (plutoonline)


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.

von Marcus (Gast)


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.

von Sascha D. (plutoonline)


Lesenswert?

@Marcus

Sorry das ich so Dumm frage, aber ich bin C-Neuling und ich hab noch
nicht so den rechten Durchblick....

Wie kann ich dann den Wert der Bit's z.B. in einer Schleife auslesen.
Und wie kann ich das Byte zuweisen?


Fragen über Fragen....

von Marcus (Gast)


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

von Sascha D. (plutoonline)


Lesenswert?

Ich hab mich vielleicht ein bischen unglücklich ausgedrückt, aber so
wird das ja nicht funktionieren, oder doch?

for(int i=0;i>=7;i++)
  {
   c0idr_addr.b.idri = 1;
  }

von Marcus (Gast)


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...?

von Kon (Gast)


Lesenswert?

Hi,

also wenn du grundsätzlich wissen willst, wie man aus einem Byte-Wert
erfährt welche Bits gesetzt sind, dann solltest du die mal Umrechnung
von Dezimal nach Binär ansehen z.B. hier:
http://www.ulthryvasse.de/db1.html#ch212

Aber vielleicht beschreibst du etwas ausführlicher das "Problem" und
bekommst evtl. einen Lösungsansatz für dein Problem.

Beste Grüße Kon

von Stefan (Gast)


Lesenswert?

// wenn das die Variablen sind
unsigned char mein_byte;
unsigned char mein_bit[8];
unsigned char i;

// könnte man die Aufgabe so lösen
for(i=0; i<8; i++)
    mein_bit[i] = (mein_byte & (1<<i));

von Sascha D. (plutoonline)


Lesenswert?

Ich hab mir jetzt mit eueren Anregungen folgendens ausgedacht,
könnte das so funktionieren.

for(uint8_t i = 0; i <= 7; i++)
      {
  if (byte%2== 0)
  {bit[x]=0;}
  else
  {bit[x]=1;}
  byte >>= 1;
      }

als Ergebnis soll das Byte in dem Array bit[0..7] stehen.

von Stefan (Gast)


Lesenswert?

Geht auch. Du änderst halt "byte". Wenn das egal ist. Und bit[x] geht
nicht, es muss bit[i] sein ;-)

von D.v.L. (Gast)


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

von TheMason (Gast)


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

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.