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
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? :-)
>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
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
Mit entsprechenden Bitmanipulationen geht das schon. Lies mal: http://www.mikrocontroller.net/articles/Bitmanipulation Ist ohnehin Grundlagenwissen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.