"<<" bzw. ">>" in C

Gast #367825
Lesenswert?
• ▲
▼
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
Persönliche Seite #367826
Lesenswert?
• ▲
▼
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.
Gast #367827
Lesenswert?
• ▲
▼
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!
Gast #3525791
Lesenswert?
• ▲
▼
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.
#3526600
Lesenswert?
• ▲
▼
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 :-)
#3526622
Lesenswert?
• ▲
▼
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);
Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.