Archiv verlassen und diese Seite im Standarddesign anzeigen : Operatoren frage
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?
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 ?
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?
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
Ok, danke euch zweien für die Antworten. :)
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.