www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zur C-Syntax


Autor: Techniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Bin gerade dabei mir C anzueignen.. ;)

Hab da mal eine Frage zur Bitoperation.
z.B. folgender Code:

x = PINA & (1<<PINA0)

Dann wird doch der Zustand vom Pin PA0 in die Variable (als char
definiert) x übernommen, wobei Bit 1 bis 7 von x fest 0 sind.

Richtig?

Was aber bedeutet "1<<abc" genau?

Hat das was mit der Bitoperation "Linksschieben" zu tun?
Wenn ja, was bedeutet die Eins?  :-)

Hab schon gesucht, aber nichs genaues gefunden...
(..oder mit falschen Stichwörtern gesucht..)

Danke!

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In ASM schiebst du damit eine 1 um abc Stellen nach links. Das dürfte in
C genauso sein.

...

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Befehl "maskiert" sozusagen PINA0 aus. D.h. in x steht nachher nur
noch der Wert von PINA0 drin, die restlichen Bits sind low, wie du ja
schon festgestellt hast.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Was aber bedeutet "1<<abc" genau?
>
> Hat das was mit der Bitoperation "Linksschieben" zu tun?

Ja.

> Wenn ja, was bedeutet die Eins?  :-)

Die ist das, was geschoben wird. Un wieviele Bits es geschoben werden
soll, steht rechts.

Autor: Techniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Könnte man anstatt der Eins auch was anderes schreiben?
Zum Bleistift 0? Oder 10?

Oder muß da immer eine 1 stehen?

Was passiert, wenn ich die 1 um 8 Stellen verrutsche? Eigendlich
nichts, oder? (hat dann das verschieben um 9 Stellen den gl. Effekt wie
um 1 Stelle?)

Autor: Bob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin Techniker,
im Befehl 1<<abc steht links der Wert der manipuliert wird, in der
Mitte die Operation, die durchgeführt wird und links der Operand.
Kleines Beispiel:
1<<4:
vorher: b00000001
Die Operation: b00000001 << 4
führt zu: b00010000 (16 dezimal)

Eine Null zu shiften, macht demnach wenig Sinn, da das Resultat
höchstwahrscheinlich wieder Null ist. Alles Klar?

Gruß Bob

Autor: Wegstabenverbuchsler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
steht  links der Wert der manipuliert wird, in_ _der
Mitte die Operation, die durchgeführt wird und links der Operand.

Und was steht rechts ? _*FG*_

Autor: Rahul Der trollige (rahul)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
rechts steht eine Zahl. Manchmal in Form eines Makro.
Man kann übrigens auch nach rechts shiften (mit >>).
Das ist besonders bei Wandlung von 16Bit-Werten in 2 8Bit-Werte
interessant. Siehe auch UBRRL...

Autor: Bob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Buchstabenverwurschtler
Nach links und Mitte bleibt ja nur noch rechts übrig; simpler
Schreibfehler

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Könnte man anstatt der Eins auch was anderes schreiben?

Du kannst schieben, was du willst. Es sollte halt nur etwas für die
Situation Sinnvolles sein :)

> Zum Bleistift 0?

Wenn du eine 0 verschiebst, kommt wieder nur 0 raus.

> Oder 10?

Ja.

> Oder muß da immer eine 1 stehen?

Im konkreten Fall muß es eine 1 sein, sonst ist das Ergebnis ja
anders.

> Was passiert, wenn ich die 1 um 8 Stellen verrutsche?

Ich vermußte mal, du beziehst dich auf einen 8-bit-Typen. Das Literal 1
hat nämlich den Typ int.

Üblicherweise kommt eine 0 raus, aber laut C-Norm führt ein Verschieben
um die Bitbreite des Typs auf der linken Seite oder mehr zu
undefiniertem Verhalten, muß also vermieden werden.

> Eigendlich nichts, oder?

Doch, denn eine 1, die beim Schieben "rausfällt", ist schlicht weg.
Die kommt nicht wieder von der anderen Seite rein.
Weiterhin ist das Verhalten laut C-Norm undefiniert

> (hat dann das verschieben um 9 Stellen den gl. Effekt wie
> um 1 Stelle?)

s.o.

Autor: Techniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DANKE AN ALLE! :-D

Jetzt hab ichs geschnallt! ;)

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DANKE
ich jetzt auch. :-)

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.