mikrocontroller.net

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


Autor: Lukas Piet (lzaman)
Datum:

Bewertung
0 lesenswert
nicht 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)"?

Autor: Timberwolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist ein Vergleichsoperator und bedeutet "ungleich" also das 
Gegenteil von "==".

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

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A = A | B
ist identisch mit
A |= B

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ungleich wäre != und nicht |=

Autor: Mike J. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
| = bitweises oder

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

Autor: Lukas Piet (lzaman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ein "OR" oder heisst das das dem RegisterA eine Bit B zugewiesen 
wird?

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Lukas Piet (lzaman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das or kenn ich ja aber wieso schreibt man dann

ADSCRA |= (1<<ADSC);

anstatt

ADSCRA = (1<<ADSC);

?

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lukas Piet (lzaman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super Antwort. Jetzt hab ichs verstanden.

Danke.

Autor: Timberwolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups ja hab tatsächlich das "|" als "!" gelesen, sorry.

Autor: Roland Praml (pram)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Random ... (thorstendb) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: stepp64 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaub ich bleib dann doch bei Assembler ;-)

Sven

Autor: df311 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
soo groß ist der unterschied zwischen |= und or(i) gar nicht ;-)

C:
ADCSRA |= (1<<ADSC);

entspricht im großen und ganzen folgendem code:
ASM:
in temp1, ADCSRA
ori temp1, (1 << ADSC)
out ADCSRA, temp1

Autor: I_ H. (i_h)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Joan P. (joan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da werden sie geholfen..

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.