Hi! Ich habe eine simple C Frage, deren Antwort ich aber bis jetzt nirgends finden konnte: Was bewirken die >> und << Zeichen genau? Beim Programmieren von uCs kommt, um Bits in Register zu schreiben, ja häufig z.B. folgendes: PORTA |= (1<<PA1); Oder ich habe auch schon irgendwo mal gesehen wie mit << bzw >> eine "16-Bit Variable" in zwei 8-Bit teile zerlegt wurde. Was geschieht da genau? Ich möchte nämlich (ein) Bit(s) einer Variable in andere Variablen schreiben. Danke für Hilfe. Grüsse Chrigu
:
Gesperrt durch User
Das ist in C der "shift"- oder auch Schiebeoperator. >> schiebt bitweise nach rechts, << schiebt bitweise nach links. Alternativ kann das auch als Multiplikation bzw. Division mit einer 2er-Potenz angesehen werden: << 1 multipliziert mit 2, >> 1 dividiert durch 2. << 2 multipliziert mit 4, >> 2 dividiert durch 4 etc. Die Division ist eine Integerdivision und daher ohne Rest. Die Schiebeoperatoren sind auch nur für ganzzahlige Datentypen definiert, also nicht für float oder double. Die Notation (1 << PA1) wird verwendet, um eine Bitmaske für ein durch eine Nummer definiertes Bit zu erhalten.
Das ging aber schnell :-), ich hab's allerdings noch nicht 100%ig kapiert. Was wird bitweise wohin geschoben, also was genau bedeuten die Zahlen rechts und Links vom << wenn es überhaupt welche hat? Wäre froh um ein Beispiel. Vielen Dank!
Na gut. int a; int b; a = 3; // 0b00000011 b = a << 1; // b ist jetzt 6 0b00000110 b = a >> 1; // b ist jetzt 1 0b00000001 a = b << 5; // a ist jetzt 32 0b00100000 Links vom Operator steht der zu verschiebende Wert, rechts davon die Anzahl Bitstellen, um die verschoben werden soll. Wird's klarer?
>>>Alternativ kann das auch als Multiplikation bzw. Division mit einer >>>2er-Potenz angesehen werden Vorsicht ist geboten! Das mal probieren: printf("%d %d \n",-3/2, -3>>1); Cheers Detlef
"a = b << 5; // a ist jetzt 32 0b00100000" Wie kommt man auf 32? Verstehe ich nicht! Wie kann ich das mathematisch berechnen??
chrigu schrieb: > Ich habe eine simple C Frage, deren Antwort ich aber bis jetzt nirgends > finden konnte: Die steht in jedem C-Einsteigerbuch und -tutorial drin. Rufus Τ. Firefly schrieb: > Die Schiebeoperatoren sind auch nur für ganzzahlige Datentypen > definiert Und das Rechtsschieben zusätzlich noch nur für positive Zahlen.
Anat Fedos (anatfedos) schrieb: > "a = b << 5; > > // a ist jetzt 32 0b00100000" > > Wie kommt man auf 32? Verstehe ich nicht! Wie kann ich das mathematisch > berechnen?? Du kannst für eine Umrechnung auch den Windows Rechner zu Hilfe nehmen. Stelle ihn dazu einfach auf Programmierer. Der Thread ist übrigens schon fast 8 Jahre alt.
Servus! Danke für die Antwort! Ich habe ein folgendes Problem - hab hier ein Programm und kann das nicht verstehen - sitze schon stundenlang und meine Bücher (beide Grundkurs in C) können mir nicht helfen. Wisst Ihr wo ich das nachschauen kann? ....... printf("Eingabe: "); scanf("%i",&x); fflush(stdin); m=0x80; //128 for (i=0;i<8;i++) { a = x & m; a = a >> (7-i); printf("%i ",a); m = m >> 1; } printf(" %X \n",x); Brauche eine Schritt für Schritt Erklärung :-)
m ist eine Maske diese Maske wird in jedem Schleifendurchlauf 1 Stelle nach rechts verschoben (>>1): m=m>>1; also nacheinander 0b01000000,0b00100000 usw. Mit der Maske wird der Wert x abgeglichen: a = x & m; nur wenn bei x und m an der gleichen Position eine 1 steht, wird a>0. Falls a größer als 0 ist, soll eine 1 ausgegeben werden. Deswegen wird der Wert von a soweit nach rechts verschoben, dass entweder 1 oder 0 rauskommt: a = a >> (7-i);