Wann wird dieser Ausdruck false ?

OP #1212655
Lesenswert?

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
Gast #1212678
Lesenswert?

Ü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 #1212733
Lesenswert?

> 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)
Gast #1213319
Lesenswert?

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...
Gast #1213357
Lesenswert?

> 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.
Moderator (Firma: Titel) Persönliche Seite #1213565
Lesenswert?

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...
Gast #1214540
Lesenswert?

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.

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