Forum: Mikrocontroller und Digitale Elektronik Was heisst eigentlich "|="


von Lukas P. (lzaman)


Lesenswert?

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)"?

von Timberwolf (Gast)


Lesenswert?

Das ist ein Vergleichsoperator und bedeutet "ungleich" also das 
Gegenteil von "==".

Steht allerdings in garantiert jedem C-Tutorial für Einsteiger ;)

von Frank (Gast)


Lesenswert?

A = A | B
ist identisch mit
A |= B

von Frank (Gast)


Lesenswert?

ungleich wäre != und nicht |=

von Mike J. (Gast)


Lesenswert?

| = bitweises oder

Ich denke mal wie "+=" wird das funktionieren :)

von Lukas P. (lzaman)


Lesenswert?

Also ein "OR" oder heisst das das dem RegisterA eine Bit B zugewiesen 
wird?

von Jens (Gast)


Lesenswert?

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

von Philipp B. (philipp_burch)


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).

von Lukas P. (lzaman)


Lesenswert?

das or kenn ich ja aber wieso schreibt man dann

ADSCRA |= (1<<ADSC);

anstatt

ADSCRA = (1<<ADSC);

?

von Sebastian (Gast)


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

von Lukas P. (lzaman)


Lesenswert?

Super Antwort. Jetzt hab ichs verstanden.

Danke.

von Timberwolf (Gast)


Lesenswert?

Ups ja hab tatsächlich das "|" als "!" gelesen, sorry.

von Roland P. (pram)


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

von Random .. (thorstendb) Benutzerseite


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.

von stepp64 (Gast)


Lesenswert?

Ich glaub ich bleib dann doch bei Assembler ;-)

Sven

von df311 (Gast)


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

von I_ H. (i_h)


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.

von Joan P. (joan)


Lesenswert?

Da werden sie geholfen..

http://www.schellong.de/c.htm#oper

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
Noch kein Account? Hier anmelden.