PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Was bedeutet dieser C- Code



jaepen
15.09.2008, 15:02
Hallo
Ich bin mich gerade durch den Code eines bekannten am kämpfen, dadurch bin ich auf folgende Zeile gestoßen


SBUF0 = 0xFF & *p >> 8; // put character

kann mir jemand erklären was der da macht? so richtig versteh ich das nicht.
Irgendwie ließt er was ein und verschiebt es gleichzeitig. die 0xFF ist als standartwert 0 ???
... aber was genau macht das & ???

Jaecko
15.09.2008, 15:31
Ne Vermutung hätt ich. Aber da wär interessant, was *p (bzw. p) fürn Datentyp ist, und ob SBUF0 8 oder 16 Bit hat.

Vermutung: *p wird 8 Bit nach rechts verschoben. Vom Resultat werden dann die 8 untersten Bits (Maske 0xFF = 0b11111111) SBUF0 zugewiesen...

beppo
15.09.2008, 15:35
Der holt sich Daten von Adresse p (pointer), verschiebt sie um 8 bit nach unten, maskiert die untersten 8 bit und schreibt das Ergebnis nach SBUF0. Das & ist ein bitweises UND. Das lässt nur die gesetzten Bits durch. Alle anderen werden auf Null gesetzt. Für den Fall, dass SBUF0 ein 8-bit-Register ist, wäre die Verundung mit 0xFF nicht notwendig, da das dann automatisch geschieht...

jaepen
15.09.2008, 15:48
SBUF= hat 8 Bit.
"bitweises UND" bedeutet das, das er im Prinzip ein bit nach dem anderen kopiert?
was bedeutet hier "maskiert" ?

PicNick
15.09.2008, 16:01
"bitweise" heisst, dass es keine Überträge auf andere Bits gibt (im Unterschied zu addieren)
MACHEN tut er die 8 Bit schon auf einmal.
"maskieren" heisst, nur die bits durchlassen, die in der "Maske" auf 1 sind
Wobei es egal ist, welches Byte die Daten und welches die Maske ist.
( A & B = B & A)

jaepen
15.09.2008, 16:18
ah... hinter dem *p ist ja eigentlich ein int wert, z.b 3.
die ist aber eigentlich abgespeichert als 0000011.
durch das & wird die 0000011 jetzt bitweise in das SBUF0 geschrieben?!?

ist das richtig???

Jaecko
15.09.2008, 16:21
Folgendes: Angenommen der Wert in *p wäre 0110110111001100.
Wenn du jetzt *p & 0xFF machst, dann werden die rechten 8 Bit unverändert gelassen, und der Rest auf 0 gesetzt.
die "Maske" ist 0000000011111111.

Untereinander geschrieben:
0110110111001100: Wert
0000000011111111: Maske
0000000011001100: Ergebnis (alle Werte, bei denen die Maske 1 ist, werden übernommen).

Durch das = wird das ganze dann zugewiesen.

beppo
15.09.2008, 16:24
Das ganze Byte wird nach SBUF0 geschrieben. Ich nehm mal an, daß SBUF0 das Buffer-Register für eine serielle Schnittstelle ist. Der Controller sorgt dafür, daß das Byte dann bitweise rausgejagt wird. Das & 0xFF schneidet die oberen Bits ab.

beppo
15.09.2008, 16:27
@PicNick: danke für die Übersetzung

jaepen
15.09.2008, 17:39
Das ganze Byte wird nach SBUF0 geschrieben. Ich nehm mal an, daß SBUF0 das Buffer-Register für eine serielle Schnittstelle ist.
Ja, ist es. 8 bit


[/quote]
Das & 0xFF schneidet die oberen Bits ab.[/quote]

weil SBUF0 nur 8 bit groß ist?????????
muss ich das machen..... was passiert wenn ich das nicht mache???

beppo
15.09.2008, 18:38
Wie gesagt: wenn SBUF0 ein 8-Bit-Register ist, ist "& 0xFF" nicht notwendig, weil die oberen Bits bei der Zuweisung sowiso weggeschnitten werden.