Forum: Compiler & IDEs "<<" bzw. ">>" in C


von chrigu (Gast)


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

: Gesperrt durch User
von Rufus Τ. F. (rufus) Benutzerseite


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.

von chrigu (Gast)


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!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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?

von chrigu (Gast)


Lesenswert?

Jep!, jetzt hab ichs verstanden! Vielen Dank !!
Grüsse
Chrigu

von Detlef _. (detlef_a)


Lesenswert?

>>>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

von Anat F. (anatfedos)


Lesenswert?

"a = b << 5;

  // a ist jetzt 32   0b00100000"

Wie kommt man auf 32? Verstehe ich nicht! Wie kann ich das mathematisch 
berechnen??

von Thomas K. (muetze1)


Lesenswert?

Bit 5 ist gesetzt, also 2 ^ 5 = 32

von Rolf Magnus (Gast)


Lesenswert?

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.

von Skeptiker (Gast)


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.

von Anat F. (anatfedos)


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 :-)

von Karl K. (leluno)


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);

von Anat F. (anatfedos)


Lesenswert?

Danke! Langsam kommt an :-)

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.