mikrocontroller.net

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


Autor: chrigu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 Moderator
Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: chrigu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: chrigu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jep!, jetzt hab ichs verstanden! Vielen Dank !!
Grüsse
Chrigu

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Anat Fedos (anatfedos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"a = b << 5;

  // a ist jetzt 32   0b00100000"

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

Autor: Thomas K. (muetze1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bit 5 ist gesetzt, also 2 ^ 5 = 32

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Skeptiker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Anat Fedos (anatfedos)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: karl k. (leluno)
Datum:

Bewertung
1 lesenswert
nicht 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);

Autor: Anat Fedos (anatfedos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke! Langsam kommt an :-)

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.