PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Operatoren frage



shamanu
06.02.2006, 18:26
Die Bit und Schiebe Operatoren sind mir nicht ganz klar.
Aus einem TWI Programm:
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);

Zuerst sind die Bitweise oder Operatoren, welche ein 1er bit weitergeben, wenn einer der dreien an der stelle 1 hat.
Was machen jedoch die << schiebe Operatoren?
Scheinbar (zb) TWINT in 1 hineinschieben? Würde mich über eine Erklärung freuen.

Die 2te Operation:
while(!(TWCR & (1<<TWINT)));
Das Bitweise & würde doch jedes einzelne bit verunden.
Also wenn ein bit an der selben Position bei beiden 1 ist, wäre die innere Sache bereits true mit dem ! vorne würde die schleife dann doch sofort verlassen werden?
Das kann doch so nicht stimmen, oder?

PicNick
06.02.2006, 18:51
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
Das geht in Schichten

das bedeutet erstens:
TWCR = (daseine) | (wasanderes) | (nochwas);
TWCR = (daseine) OR (wasanderes) OR (nochwas);
d.h. in TWCR sammeln sich alle Einser der drei Werte
zweitens:
(daseine) ---> (1<<TWINT)
(TWINT ist in irgendeiner .h-file definiert als eine Zahl 0-7)
das bedeutet: nimm einen EINSER ( 1 ) und schiebe ihn nach links ( << ), und zwar "TWINT"-mal
Also
(1 << 0 ) = 1 = B"00000001"
(1 << 1 ) = 2 = B"00000010"
(1 << 2 ) = 4 = B"00000100"
(1 << 3 ) = 8 = B"00001000"
......
(1 << 7 ) = 128 = B"10000000"

Und nun zu etwas völlig anderem:

while(!(TWCR & (1<<TWINT)));

auch das mußt du aufdröseln

ganz innen steht (1<<TWINT) ---> siehe oben

Dann:
TWCR & (1<<TWINT)
das in Klammer ist also EIN Bit von 8
& = AND
das ganze ergibt also einen Wert <> 0 , wenn in beiden an derselben Stelle ein Einser ist, sonst 0
! (TWCR & (1<<TWINT));
! = NOT
das ganze ergibt also einen Werte <> 0 , wenn vorher ein Nuller rausgekommen ist ( Also einfach das Gegenteil)

While ( nnn) = Solange nnnn nicht Null ist, mach die Befehle bis zum nächsten Strichpunkt.

Da steht aber nix

Also rotiert er.

Auf deutsch, komplett

while(!(TWCR & (1<<TWINT)));

warte, solange das bit (1<<TWINT) in TWCR auf 0 steht

Seltsame Sprache , gelle ?

shamanu
06.02.2006, 21:44
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
[...]
(1 << 0 ) = 1 = B"00000001"
(1 << 1 ) = 2 = B"00000010"
(1 << 2 ) = 4 = B"00000100"
(1 << 3 ) = 8 = B"00001000"
......
(1 << 7 ) = 128 = B"10000000"


Also wenn:
TWINT=7
TWSTA=5
TWEN=2
so würde die (1<<TWINT) | (1<<TWSTA) | (1<<TWEN) Operation ja B"10100100" ergeben.
Somit wäre die Zuweisung ansich gleichbedeutend zu
TWCR = 0xA4;
?

Wird das schieben immer auf einen Leeren Datenwert ausgeführt?
Also kann ich zb in 00001000 nochmals einen 1er hineinschieben, wenn ja wie? Und bewegt sich der Vorhandene dann mit?

izaseba
06.02.2006, 22:43
Hallo,
Der Picknick hat Dir das schöner erklärt, als jedes Buch oder Tutorial, toll...


so würde die (1<<TWINT) | (1<<TWSTA) | (1<<TWEN) Operation ja B"10100100" ergeben.
Somit wäre die Zuweisung ansich gleichbedeutend zu
TWCR = 0xA4;
?

Das ist richtig, wobei ich sagen muß daß TWCR = 0xA4; zwar kürzer ist, aber nicht unbedingt verständlicher, oder?
Versuch mal nach einem halbem Jahr zu verstehen, was Du da gemacht hast...
mit (1<<TWINT)..... sieht jeder sofort, welche Bits gesetzt worden sind...


Also kann ich zb in 00001000 nochmals einen 1er hineinschieben, wenn ja wie? Und bewegt sich der Vorhandene dann mit?


klar geht das z.B
TWCR |=(1<<TWEA);
verodert den alten Zustand von TWCR mit (1<<TWEA)

Gruß Sebastian

shamanu
07.02.2006, 17:42
Ok, danke euch zweien für die Antworten. :)