Hallo,
mal eine Frage an Leute die C schon länger und (hoffentlich) besser als
ich programmieren können.
Was ist programmiertechn. "sauberer" gelöst? welche der beiden
Variationen würdet Ihr verwenden und wieso?
(Plan B: ...oder ist das eigentlich sch...-egal???)
so:
naja, wenn man etwas neues lernt, sollte man es doch gleich von Anfang
an richtig machen.
Interpretiert ein compiler die beiden codezeilen unterschiedlich?
Natürlich geht auch das Prinzip "Mach ich immer so, hat bisher immer
irgendwie geklappt..."
Jeffrey L. schrieb:> welche der beiden> Variationen würdet Ihr verwenden und wieso?
ich habe ja kaum Ahnung aber
Jeffrey L. schrieb:> BIT_1
ist BOOL kann ja nur high oder low sein
ergo würde ich auf TRUE oder FALSE abfragen was halt gewünscht ist
Jeffrey L. schrieb:> var
kann ja alles mögliche sein und Jahre später weiß keiner mehr was sich
der Autor dachte
das war jetzt ja doch nur ein stilisiertes Beispiel.
Das spielt jetzt doch überhaupt keine Rolle was 'var' ist und welches
BIT ich abfrage!
Konkret im code würde das jetzt vlt. so aussehen:
gefällt Dir das besser?
Mikro 7. schrieb:> Dir ist klar dass das zwei verschiedene Bedingungen sind?
Genau! um das geht es.
Die Abfrage bezieht sich darauf, ob in dem Nocken bzw. Register das eine
Bit gesetzt ist oder eben nicht.
Beide Abfrage sind erfüllt, wenn BIT1 nicht gesetzt ist, ergo springt
der code beides mal in die Bedingung hinein.
ich vermute, dass zeile 3 schnell geprüft ist? - könnte aber auch stark
compilerabhängig sein?
...eignetlich will ich wissen wie man es in der praxis schreibt, wenn
man eben nur das eine Bit abfragen möchte und die anderen Bits "egal"
sind.
Ich verstehe die Frage nicht; die beiden Bedingungen sind ja nicht
gleichbedeutend.
Die erste Bedingung schaut sich die Bits von var an, die in BIT_1 sind.
Die zweite Bedingung schaut sich die Bits von var an, die NICHT in BIT_1
sind.
Beispiel: var = 11, BIT_1 = 10
1) var & BIT_1 = 10 => !(var & BIT_1) = false
2) var & ~BIT_1 = 01 = true
Peter D. schrieb:> Jeffrey L. schrieb:>> If (var & ~0x01)>> Bedeutet:> if (var & 0xFE)
jup!
und meine Frage eben wo liegt der Unterschied zu
If (! (var & 0x01))
Jeffrey L. schrieb:> Konkret im code würde das jetzt vlt. so aussehen:> gefällt Dir das besser?>
1
>if(u16CPU_RegisterAHBP&~SPI_FLAG_CS)
2
>
3
>if(!(u16CPU_RegisterAHBP&SPI_FLAG_CS))
4
>
Die Tücke beim ersten ist, dass das nur funktioniert, wenn im Register
noch andere Bit wie das gesuchte gesetzt sind. Ist das Register = 0x00,
dann ergibt sich
if (0 & ~SPI_FLAG_CS)... also
if (0) ... wird also nicht betreten, obwohl das gesuchte Bit nicht
gesetzt ist.
Jeffrey L. schrieb:> Mit BIT_1 meine ich wirklich BIT1, keine "willkürliche" variable...> BIT_1 ist 0x01.
Es spielt keine Rolle, ob BIT_1 nur 1 Bit gesetzt hat oder mehrere.
Wenn es für 0x01 nicht funktioniert, dann findet man auch Fälle, so dass
es für 0x02 nicht funktioniert: Man braucht nur Bit 0 mit Bit 1 zu
tauschen.
Mach doch einfach mal ein Programm, dann siehst du dass die Bedingungen
nicht äquivalent sind:
Jeffrey L. schrieb:> und meine Frage eben wo liegt der Unterschied zu> If (! (var & 0x01))
Ist erfüllt, wenn BIT_1 nicht gesetzt ist
> if (var & 0xFE)
Ist erfüllt, wenn ein mindestens eines der Bits 0, 2..7 gesetzt ist.
Also 2 völlig verschiedene Dinge.
Jeffrey L. schrieb:> Konkret im code würde das jetzt vlt. so aussehen:> gefällt Dir das besser?>> if (u16CPU_RegisterAHBP & ~SPI_FLAG_CS)>> if (! (u16CPU_RegisterAHBP & SPI_FLAG_CS))Jeffrey L. schrieb:> welche der beiden Variationen würdet Ihr verwenden und wieso?
Das kommt drauf an, was du erreichen willst. Fest steht, dass die beiden
Ausdrücke ein völlig verschiedenes Ergebnis liefert. Guck dir die
Minimalversion mit je zwei Bit an.
Normalerweise brütet man konzentriert über eine Wertetabelle, probiert
ein paar Zusammenhänge aus, ..und weiß hinterher einigermaßen, was zu
tun ist bzw. wie gewisse Zusammenhänge und Sonderzeichen im
Bool-Zusammenhang einzuordnen sind.
C und Bool sind ja nun auch nicht die besten Freunde, wo dann gut ist,
die ein oder andere gute Praxisdokumentation zu finden:
https://www.cs.uic.edu/~jbell/CourseNotes/C_Programming/Decisions.html
Typische Boolzusammehänge sind auch nicht immer so leicht auf einen
Blick zu verstehen. Weswegen Papier und Bleistift auch eine (sehr) gute
Hilfe sein können.
Simon G. schrieb:> so habe ich das mal gemacht.
Wenn Du schon ein Macro namens "bit_is_low" definierst, warum nutzt Du
stattdessen ein invertiertes "bit_is_high"?
Norbert schrieb:> #define BIT(x) (1U<<x)
Fehler: x ist auf der rechten Seite nicht geklammert. Wenn du dann sowas
machst:
1
BIT(a>b?a:b)
kommt etwas völlig unerwartetes raus.
> !!(value & BIT(3)) // liefert 1 (und nur 1) wenn das Bit gesetzt ist.
Wobei sich die Frage stellt, wo man das braucht. Wenn es schon auf die
Zahl 1 ankommt, würde ich das explizit hinschreiben:
1
(value&BIT(3))?1:0
Wenn es nur die Abfrage einer Bedingung ist, ist es nicht wichtig, ob
das genau 1 ist oder irgendwas anderes von 0 verschiedenes.
Jörg W. schrieb:> Fehler
Ja, war einfach schnell hin getippt. Doch genau darauf kam es bei der
Frage aber auch gar nicht an. Sondern nur zur Verdeutlichung, dass man
ein Bit an verschiedenen Positionen haben kann!
Jörg W. schrieb:> Wobei sich die Frage stellt, wo man das braucht.
Manchmal möchte man sich einen "aufgeräumten" boolschen Wert sichern.
Und ›0‹ oder ›1‹ passt dann sogar in ein u_int8 hinein. Oder, auch
schön, in ein Bitfield.
Aber wie immer kann man die Aufgabe natürlich auf zig Arten lösen.
Jörg W. schrieb:> Wenn es schon auf die Zahl 1 ankommt, würde ich das explizit hinschreiben:
Hier geht es m.E. eher um die Repräsentation von true (auch wenn beides
1 ist)
* !! --> beliebiger Ausdruck zu Boolean
* ?1:0 --> Wertepaar, nicht boolean (Boolean kann einfacher erfolgen)
Norbert schrieb:> Und ›0‹ oder ›1‹ passt dann sogar in ein u_int8 hinein.
bool passt auch in 8 Bit. stdbool.h is your friend. bool wandelt auch
gleich noch automatisch alles in true und false um, d.h. der Datentyp
kann (wenn man ihn nicht irgendwo vergewaltigt) nur diese beiden Werte
annehmen.
Jeffrey L. schrieb:> if (var & 0xFE)> If (! (var & 0x01))
Probier doch mal für ein paar Werte von var aus, was passiert bzw.
rauskommt; Tip: versuchs auch mal für den Fall var=0.
Hallo Jeffrey L.,
sicherlich willst Du mit der Abfrage If (! (var & BIT_1)) ermitteln, ob
das Bit mit dem Namen BIT_1 gelöscht ist. Das ist so auch vollkommen
richtig.
Die Abfrage mit If (var & ~BIT_1) wäre sogar falsch.
Die Abfrage auf ein gesetztes Bit, wäre also immer
if ( Var & Bit_x )
und die Abfrage, ob ein Bit gelöscht ist, wäre immer
if ( !( Var & Bit_x ) ).
Hierbei sind die Bits dann so definiert:
#define Bit_7 0x80
#define Bit_6 0x40
#define Bit_5 0x20
#define Bit_4 0x10
#define Bit_3 0x08
#define Bit_2 0x04
#define Bit_1 0x02
#define Bit_0 0x01
Einen gesegneten Gruß