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
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);
  
 Thread beobachten
 Thread beobachten Seitenaufteilung abschalten
 Seitenaufteilung abschalten