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.