Was heisst eigentlich "|="

#865268
Lesenswert?

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

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
#865303
Lesenswert?

> 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
Persönliche Seite #865324
Lesenswert?

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

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
#865793
Lesenswert?

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.

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