Hallo, wenn ich folgenden Ausdruck so schreibe funktioniert er nicht. FLAGS ist ein Integer, mit dem ich ein 8bit Feld machen will. if ((FLAGS & 0b10000000)==1) nur wenn ich ihn so schreibe if (FLAGS & 0b10000000) Ich wollte die obige Schreibweise nur deswegen verwenden, da ich den etwas groesseren Vergleich unten auf 0 abfragen moechte und ich aber nicht weiss, wie ich ihn noch anderst schreiben kann. So wie er aktuell ist, funktioniert er aber nicht richtig. if ((PIND == 0b11111101) & ((FLAGS & 0b01000000)==0)) Gruss Roger
> if ((FLAGS & 0b10000000)==1)
Wird nie erfüllt.
eventuell so:
if ((FLAGS & 0b10000000)==0b10000000)
oder so:
if ((FLAGS & 0b10000000)>=1)
Über diese Kleinigkeit stolpert man schnell mal. Die Grundlagen der Bitmaskierung sind wohl nicht ganz so geläufig. Wenn Du (FLAGS & 0b10000000) maskierst, dann kommt entweder 0 raus oder 128d bzw. 0x80. Das Bit wird zwar ausgeschnitten, bleibt aber an seiner Position (Bit7) und behält damit auch seine Wertigkeit von 2^7 (sprich: 2 hoch 7). Dann kann man lange auf == 1 vergleichen! Ohne das "==1" funktioniert es, weil alles größer 0 als "true" interpretiert wird. Nur 0 ist "false". Deshalb wundert man sich schnell mal, wenn man auf "==true" vergleicht. Das ganze wird wahrscheinlich auch noch vom compiler abhängen.
gast wrote: > eventuell so: > if ((FLAGS & 0b10000000)==0b10000000) > > oder so: > if ((FLAGS & 0b10000000)>=1) Oder if ((FLAGS & 0b10000000) != 0) Hässlicher: if (FLAGS & 0b10000000)
>if ((FLAGS & 0b10000000) < 0)
Was heisst gehen?
Es ist syntaktisch korrekt aber gleich wertig zu
if (FLAGS & 0b10000000)
da das Schieben um 0 Bit nach links eben keinen Effekt hat.
Oohhh. So ein Sch.... Sorry. Natürlich ist das ein einzelnes <. Das geht schon wenn FLAGS ein Vorzeichenbehafteter Typ ist.
> if ((FLAGS & 0b10000000) < 0)
war nicht ganz ernst gemeint (und 'bte' sollte 'btw' - by the way
heissen;) )
Noch ein kleiner Tip falls du öfters im Code Bits in Flags testen
willst, ich nehme gerne #define Makros dafür.
in der art wie zB:
1 | #define IS_ALL_BIT(f,bm) ((f&bm)==bm)
|
2 | #define IS_ONE_BIT(f,bm) ((f&bm)!=0)
|
für zB:
1 | if IS_ALL_BIT(myflag,MY_FLAGBIT_3|MY_FLAGBIT_8) |
Jörg Wunsch wrote: > Hässlicher: > if (FLAGS & 0b10000000) Über Schönheit lässt sich streiten ... ;-) Aber du hast Recht, so richtig schön ist es erst mit der Hex-Zahl:
1 | if (FLAGS & 0x80) |
Jörg Wunsch wrote: > Hässlicher: > > if (FLAGS & 0b10000000) Ich schreib lieber:
1 | if (FLAGS & 1<<7) |
oder wenns andersrum sein soll:
1 | if (!(FLAGS & 1<<7)) |
Peter
> if (FLAGS & 1<<7)
Ich find schöner
if (FLAGS & (1<<7))
Da muss man weniger Angst um Operatorvorrang haben.
Simon K. wrote: > if (FLAGS & (1<<7)) > > Da muss man weniger Angst um Operatorvorrang haben. Der Compiler kennt die Vorrangregeln, da muß man keine Angst haben. Nur wenn man sich selber unsicher ist, sollte man Klammern nehmen. Peter
Peter Dannegger wrote:
> Nur wenn man sich selber unsicher ist, sollte man Klammern nehmen.
Code sollte auch fuer andere leicht und schnell lesbar sein. Der
naechste Entwickler hat vieleicht nicht Vorrangregeln, sondern Templates
oder sonstwas als Hobby...
Hi, bei Bitmasken wertet man immer <> 0 aus... zumindest wenn auf Boolsche Werte überprüft werden soll. Grüße Rocky
> bei Bitmasken wertet man immer <> 0 aus...
Oh wie ich solche Hausfrauen-Programmierrezepte "liebe". Bei Bitmasken
wertet man das aus, was man auswerten will. Wenn der Algorithmus es
erfordert auch == 0.
1 | if((DATA & MASK) == 0) |
beziehunggsweise
1 | if(!(DATA & MASK)) |
ist völlig ok wenn der Test dem entspricht, was man wissen will. Wenn man auf einem wilden Trip ist, gehen noch ganz andere Sachen. Zum Beispiel zuerst mit !! normalisieren um von Bit-Operationen auf logische Operationen umsteigen zu können.
Ich verwende gerne sprechende Variablennamen, z.B.
1 | uint8_t EndschalterOben, EndschalterUnten; |
Eine Schreibweise wie
1 | if (EndschalterOben) { |
2 | }
|
3 | if (EndschalterUnten) { |
4 | }
|
ist immer noch hübscher lesbar als
1 | if (EndschalterOben!=0) { |
2 | }
|
Und ganz extrem wirds bei Abfragen wie
1 | if (EndschalterOben=0) { |
2 | }
|
Nach so einem Fehler sucht manch einer lang.... ;-)
@ Norgan
> zuerst mit !! normalisieren
Sieh dir mal an, was der Compiler daraus macht :-o
Fazit: Ich bin von dem Trip abgekommen...
1 | if (EndschalterOben=0) { |
2 | }
|
... eigentlich sucht man überhaupt nicht lange nach derartigen Fehlern, da einem der GCC eine Warnung um die Ohren haut. Vorrausgesetzt natürlich, man hat sie nicht ausgeschaltet oder ignoriert sie einfach.
> ... der GCC ... Ja, und andere Compiler? > ... eine Warnung ... > ... man ignoriert sie einfach. Genauso wie die 147 anderen auch... :-/
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.