Forum: Mikrocontroller und Digitale Elektronik Frage zur C-Syntax


von Techniker (Gast)


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!

von Hannes L. (hannes)


Lesenswert?

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

...

von Simon K. (simon) Benutzerseite


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.

von Rolf Magnus (Gast)


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.

von Techniker (Gast)


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

von Bob (Gast)


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

von Wegstabenverbuchsler (Gast)


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*_

von Rahul D. (rahul)


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

von Bob (Gast)


Lesenswert?

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

von Rolf Magnus (Gast)


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.

von Techniker (Gast)


Lesenswert?

DANKE AN ALLE! :-D

Jetzt hab ichs geschnallt! ;)

von Daniel (Gast)


Lesenswert?

DANKE
ich jetzt auch. :-)

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.