Forum: Mikrocontroller und Digitale Elektronik Anfägerfrage zum setzen einzelner Bits


von quincy (Gast)


Lesenswert?

Hallo Forum,

ich habe mich im GCC Tutorial schon zu dem Thema belesen, wie ich 
einzelne Bits in einem Byte setzen kann, das klappt auch alles ganz gut. 
Nun zu meiner Frage,

angenommen ich habe 2 Integer

int Eingang;
int Ausgang;

nun möchte ich das Bit 1 in Ausgang gleich Bit 4 in Eingang ist.

Wie würdet ihr das umsetzen? ich habe schon X Versionen durchprobiert 
doch komme leider zu keinem Ergebnis.

Mit freundlichen Grüßen

von Floh (Gast)


Lesenswert?

quincy schrieb:
> nun möchte ich das Bit 1 in Ausgang gleich Bit 4 in Eingang ist.

wenn bit4 im eingang gesetzt
  ausgang bit 1 setzen
ansonsten
  ausgang bit 1 löschen

hilft das? :-)

von ich (Gast)


Lesenswert?

>wenn bit4 im eingang gesetzt

Das überprüft man am besten mit einem ausmaskieren aller Bits auser Bit 
4 und anschließendem Vergleich auf Null

von quincy (Gast)


Lesenswert?

Leider nicht wirklich so funktioniert es bei mir auch.

Ich würde gerne  wissen ob ich das auch ohne eine IF Abfrage machen 
kann.

so in der Art Ausgang (bit4) = Eingang (Bit1);

mfG

von Kali (Gast)


Lesenswert?

Mit entsprechenden Bitmanipulationen geht das schon.

Lies mal: http://www.mikrocontroller.net/articles/Bitmanipulation

Ist ohnehin Grundlagenwissen.

von Karl H. (kbuchegg)


Lesenswert?

quincy schrieb:
> Leider nicht wirklich so funktioniert es bei mir auch.
>
> Ich würde gerne  wissen ob ich das auch ohne eine IF Abfrage machen
> kann.

machbar ist es.
Es ist aber weder schneller noch schöner als die Variante mit if.
Und: Es verallgemeinert nicht so gut


   Ausgang &= ( 1 << Bit4 );
   Ausgang |= ( Eingang & Bit1 ) << 3;

dieser Code ist hochgradig (vor allen die Anzahl und die Richtung der 
Verschiebungen in der 2.ten Anweisung) davon abhängig, dass es sich um 
Bit 1 und Bit 4 handelt. Bei anderen Bits sieht der Code komplett anders 
aus. Zb eine Übernahme von 4 nach 1

   Ausgang &= ( 1 << Bit1 );
   Ausgang |= ( Eingang & Bit4 ) >> 3;

Beachte, dass sich die Schieberichtung umgedreht hat.

Das ist das eine.
Das andere ist, dass die beiden Codes nicht ganz 100% gleichwertig sind. 
In der 2.ten Version wird Ausgang zwischendurch ganz kurz auf jeden Fall 
auf 0 gesetzt, um dann möglicherweise vom Eingang wieder ein 1 Bit zu 
bekommen. In der If-Version ist das nicht der Fall.

Will man diese daher gleichwertig machen, dann müsste man das so machen


    temp = Ausgang
    temp &= ( 1 << Bit4 );
    temp |= ( Eingang & Bit1 ) << 3;
    Ausgang = temp;

und jetzt erkennt man schon, dass der Aufwand bei weitem größer als in 
der if-Version ist bei gelichzeitigem Verlust von Klarheit. Auch kann 
diese Version vom Compiler bei weitem nicht so gut optimiert werden, wie 
die if-Version.


Dann gäbe es da noch eine Variante, in der man das Schieben und 
Maskieren dem Compiler überantwortet, indem man sich eine struct mit 
einem Bitfeld aufbaut. Dann übernimmt der Compiler zumindest das lästige 
Feststellen der Richtung und der Anzahl der Verschiebungen.

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.