Habt ihr schon mal versucht nach "|=" zu googeln. Es gibt keine Suchergebnisse zu diesem Operator. Hätte gern mal gewusst, was das denn bedeutet in C. Ist das eine Zuweisung oder eher das gleiche "(= x|y)"?
Das ist ein Vergleichsoperator und bedeutet "ungleich" also das Gegenteil von "==". Steht allerdings in garantiert jedem C-Tutorial für Einsteiger ;)
Also ein "OR" oder heisst das das dem RegisterA eine Bit B zugewiesen wird?
Hallo Lukas, x |= y; ist das gleiche wie x = x | y; also eine bitweise ODER-Verknüpfung mit anschließender Zuweisung. Bitte nicht mit "!=" (ungleich) verwechseln! Gruß Jens
Nein, das heisst, dass in der Zielvariablen die Bits gesetzt werden, die im linken, rechten oder in beiden Operatoren gesetzt sind. Wahrheitstabelle von OR: A | B = Y 0 | 0 = 0 0 | 1 = 1 1 | 0 = 1 1 | 1 = 1 Achja: Bei der Verwendung von Flags tut's oft auch eine Addition, ich empfehle allerdings dringendst, OR zu verwenden, wenn es um bitweise Operationen geht. Ist nämlich ein Bit bereits gesetzt, werden die oberen Bits auch verändert (Eine bitweise Addition entspricht einem logischen XOR, 1 + 1 = 0).
das or kenn ich ja aber wieso schreibt man dann ADSCRA |= (1<<ADSC); anstatt ADSCRA = (1<<ADSC); ?
Mit erstem setzt du das Bit das mit der Maske (1<<ADSC) angegeben ist in der Variablen ADSCRA. Und nur dieses eine Bit. Alle anderen bleiben unverändert. Beim zweiten wird die Maske der Variablen zugeweisen. Die Variable ADSCRA enthält nun die Maske. Ein Bit ist gesetzt, die anderen gelöscht. Egal, was vorher in ADSCRA stand. Sebastian
> ADSCRA |= (1<<ADSC); Das Bit ADSC wird in ADSCRA gesetzt, Rest bleibt unverändert > ADSCRA = (1<<ADSC); NUR das ADSC-Bit ist gesetzt, alle anderen Bits sind 0 Das Gegenteil wäre übrigens: ADSCRA &= ~(1<<ADSC); Das ADSC-Bit wird gelöst, oder anders ausgedrückt, alle Bits, bis auf das ADSC "überleben" Gruß Roland
C-Programmmierer sind von Hause aus faul. Das sind verkürzte Schreibweisen. Geht mit allen Operatoren: x=x+1; --> x+=1; x=x-1; --> x-=1; x=x*5; --> x*=5; x=x|5; --> x|=5; Hier werden zwei sachen gemacht. ODER fügt immer Bits hinzu, und UND löscht Bits. Daher muss man zum Löschen eines Bits ein wenig tricksen. Man verundet mit dem Inversen (NOT, ~) von dem Bit, welches man löschen möchte: ADSCRA = ADSCRA & (~ (1<<ADSC)); ADSCRA &= ~(1<<ADSC); VG, /r.
soo groß ist der unterschied zwischen |= und or(i) gar nicht ;-) C:
1 | ADCSRA |= (1<<ADSC); |
entspricht im großen und ganzen folgendem code: ASM:
1 | in temp1, ADCSRA |
2 | ori temp1, (1 << ADSC) |
3 | out ADCSRA, temp1 |
Besser du beschäftigst dich einmal richtig mit der Boolschen Algebra. AND und OR bilden wenn ich mich richtig erinnere einen Körper, das heist es gelten folgende Eigenschaften (die gelten in jedem Fall, bin mir nur grad nicht scher ob's damit ein Körper ist): (A OR B) OR C == A OR (B OR C) (Assoziativ, selbes für AND), A OR B == B OR A (Kommutativität, selbes für AND), A AND 1 == A, und A OR 0 == A (Neutralelement), A AND NOT(A) == 0 und A OR NOT(A) == 1 (Inverses), und schließlich (A OR B) AND C == (A OR C) AND (B OR C) Distributivität, wobei man die Klammern weglassen kann, AND hat die höhere Priorität. Daher schreibt man AND oft als * (mal) und OR als +. Also (A+B)C == AC + BC. Brauchbar ist dann noch DeMorgan. Je nachdem was man machen möchte auch DNF, KNF, KV Diag. usw.
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.