Anfägerfrage zum setzen einzelner Bits

Gast #2324577
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
#2324708
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.

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