Forum: Compiler & IDEs Verständnisfrage zu Bitoperatoren


von Karima L. (runkelruebe)


Lesenswert?

Hallo,

ich habe in einem Tutorial zum LED-Blinken folgende Code-Zeile nicht 
verstanden:
1
LED_PORT |= (1 << LED_PORTPIN);
Ich habe gleich mehrere Probleme:
- Bedeutet die Schreibweise "|=" nicht letztlich, dass alle Bits der 
"rechten" Seite nach einer Links-verschiebung in die Variable LED_PORT 
übertragen werden, da "|" kein exklusives oder ist?
- Warum verwendet man überhaupt das bitweise oder und die 
Linksverschiebung, anstatt beiden Variablen gleich die Werte zuzuweisen 
sodass der Portpin high ist?



Gruß
Karima

von kopfkratzer (Gast)


Lesenswert?


von Joe S. (bubblejoe)


Lesenswert?

Karima L. schrieb:
> LED_PORT |= (1 << LED_PORTPIN);

Bedeutet
1
LED_PORT = LED_PORT | (1 << LED_PORTPIN);

LED_PORTPIN steht nur für eine Zahl.
| ist ein logisches ODER, damit kann bestimmte Bits gezielt setzen, ohne die 
anderen zu beeinflussen. Es geht theoretisch auch mit den ganzen PORT einen Wert 
zuweisen, allerdings muss man dann den vorigen PORT-wert wissen, da man sonst 
unabsichtlich Bits ändern tut, die vlt gleich bleiben sollen.

Rechne einfach mal ein paar Beispiele durch auf nem Zettel, dann wird 
das einem klar.

von Michael M. (technikus)


Lesenswert?

Karima L. schrieb:
> - Bedeutet die Schreibweise "|=" nicht letztlich, dass alle Bits der
> "rechten" Seite nach einer Links-verschiebung in die Variable LED_PORT
> übertragen werden, da "|" kein exklusives oder ist?
Da wird 1 um LED_PORTPIN Stellen geschoben. Es gibt nur genau ein Bit, 
das 1 ist und nur dieses wird gesetzt. Mal Dir mal eine Wahrheitstabelle 
für | und ^ auf, dann siehst Du klarer.

> - Warum verwendet man überhaupt das bitweise oder und die
> Linksverschiebung, anstatt beiden Variablen gleich die Werte zuzuweisen
> sodass der Portpin high ist?
Weil man die restlichen 7 Bits nicht verändern will, sondern nur das 
eine Bit auf 1 setzen will.


@ Joe. B
Logisches Oder würde ich hier lieber nicht schreiben, besser bitweises. 
Logisches Oder ist in C nämlich ||.

Servus
Michael

von Joe S. (bubblejoe)


Lesenswert?

Michael M. schrieb:
> @ Joe. B
> Logisches Oder würde ich hier lieber nicht schreiben, besser bitweises.
> Logisches Oder ist in C nämlich ||.

Hast natürlich Recht!

von Karima L. (runkelruebe)


Lesenswert?

Danke, ich verstehe es jetzt schon besser. Auch wenn mir immer noch 
nicht klar ist, wozu man das oder braucht. Es überprüft doch, ob an der 
betroffenen Stelle von LED_PORT das Bit  schon eins ist, und wenn nicht, 
setzt der Operator das Bit auf eins. (?)
Warum kann man diesem Bit dann nicht den Wert 1 zuweisen? Oder habe ich 
das Ganze doch falsch verstanden?

Gruß
Karima

von xfr (Gast)


Lesenswert?

Karima L. schrieb:
> Danke, ich verstehe es jetzt schon besser. Auch wenn mir immer noch
> nicht klar ist, wozu man das oder braucht. Es überprüft doch, ob an der
> betroffenen Stelle von LED_PORT das Bit  schon eins ist, und wenn nicht,
> setzt der Operator das Bit auf eins. (?)

Das ist nicht der Punkt. Wenn man das Bit sowieso auf 1 setzten will, 
braucht man nicht überprüfen, was es vorher für einen Wert hat. ;)

Wichtig dabei ist das "oder 0" bei den anderen Stellen. Damit bleiben 
die anderen Bits so wie waren: "1 oder 0" bleibt 1, "0 oder 0" bleibt 0.

von Karl H. (kbuchegg)


Lesenswert?

Karima L. schrieb:
> Danke, ich verstehe es jetzt schon besser. Auch wenn mir immer noch
> nicht klar ist, wozu man das oder braucht.

Wie schon gesagt:
Um ein einzlenes Bit zb an einem Port auf 1 zu setzen OHNE die anderen 
Bits zu beeinflussen oder auch nur wissen zu müssen, wie die gerade 
stehen.

> Es überprüft doch,

da wird überhaupt nichts überprüft.


> Warum kann man diesem Bit dann nicht den Wert 1 zuweisen?

Das ist dann das Gegenteil: Das bit auf 0 setzen.
Und das geht mit einer & OPeration

   PORT &= ~( 1 << Bit );

von Karima L. (runkelruebe)


Lesenswert?

Vielen Dank euch beiden, jetzt ist es mir klar.

schönen Tag noch!
Karima

von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

Hallo!

Karl Heinz Buchegger schrieb:
> PORT &= ~( 1 << Bit );

Und was bedeutet eigentlich das "~" vor der Bit verschiebung? Invertiert 
es das ganze Konstrukt der Bitverschiebung? Und wenn ich mehrere Bits 
löschen will, wie sieht das dann aus?

PORT &= ~(1<<Bit1) | (1<<Bit2)

PORT &= ~(1<<Bit1) | ~(1<<Bit2)

PORT &= ~(1<<Bit1) & (1<<Bit2)

PORT &= ~(1<<Bit1) & ~(1<<Bit2)

Ich denke, die erste Variante, bin mir aber nicht sicher.


MfG Dennis

von xfr (Gast)


Lesenswert?

Dennis H. schrieb:
> Und was bedeutet eigentlich das "~" vor der Bit verschiebung? Invertiert
> es das ganze Konstrukt der Bitverschiebung?

Ja.

Dennis H. schrieb:
> PORT &= ~(1<<Bit1) & ~(1<<Bit2)

Damit geht es. Oder auch mit:
PORT &= ~((1<<Bit1) | (1<<Bit2))

Rechne es am besten auf dem Papier mal nach.

von Hmm (Gast)


Lesenswert?

>Ich denke, die erste Variante, bin mir aber nicht sicher.
Sicherheit bekommst Du wenn Du solche Aufgaben einmal selbst löst.

Das ist wirklich recht einfach.
Mach Dir eine Wahrheitstabelle (natürlich nur für die möglichen resp. 
relevanten Kombinationen und nicht für alle 8 Bits).

Falls das nicht klappt, helfen wir Dir weiter. Aber zeige uns hier was 
Du gemacht hast.

von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

Hmm schrieb:
> Mach Dir eine Wahrheitstabelle

Das wäre kein Problem, nur wusste ich einfach nicht, inwieweit sich 
dieses "~" auf alles, was danach steht, auswirkt. Ich verstehe durchaus, 
was ich damit mache, ich habe auch eine Weile in Assembler programmiert, 
ich verstehe also, was ich machen will, nur die Umsetzung in C war mir 
nicht zu 100% klar.

xfr schrieb:
> Dennis H. schrieb:
>> PORT &= ~(1<<Bit1) & ~(1<<Bit2)
>
> Damit geht es. Oder auch mit:
> PORT &= ~((1<<Bit1) | (1<<Bit2))

Jetzt habe ich direkt mal eine kleine Weile gebraucht, um die zweiten 
Klammern um das zweite Beispiel zu sehen. Okay, damit wäre also auch das 
klar, danke euch für eure Antworten


MfG Dennis

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.