PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : wo finde ich etwas über ' << '



Jacob2
29.07.2008, 13:10
Hi,
hab (schon wieder) eine Frage: Wo finde ich im Internet etwas über den Operator ' << ' ?
"C << operator" bei Google hilft nicht weiter!

sternst
29.07.2008, 13:24
"C << operator" bei Google hilft nicht weiter!

Nicht? Wenn du gleich den ersten Treffer (wikibooks) anklickst, welche Fragen bleiben dann bezüglich "<<" noch offen?

oberallgeier
29.07.2008, 13:51
Hei Jacob2,

Schau mal hier:
https://www.roboternetz.de/wissen/index.php/C-Tutorial#Liste_der_Operatoren

oder hier
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Ver.C3.A4ndern_von_Registerinhalten

wobei die Bitmanipulation explizit noch hier
http://www.mikrocontroller.net/articles/Bitmanipulation

hübsch beschrieben wird. Es ist eigentlich eine häufige Operation, aber man kann die - wenn man es kann - ziemlich tricky anwenden.

zerush
30.07.2008, 00:37
<< und >> sind shift-Operatoren.
Damit verschiebt man die Daten um eine bestimmte Anzahl Bits nach links oder rechts.

Beispiele:
unsigned char bla = 0xcb; //11001011

(bla << 1) ergibt: 0x0196 //00000001 10010110 (unsigned short!!!, ggf type-casten, um wieder unsigned char zu bekommen)
(bla << 3) ergibt: 0x0658 //00000110 01011000 (unsigned short!!!, ggf type-casten, um wieder unsigned char zu bekommen)
(bla >> 1) ergibt: 0x65 //01100101
(bla >> 4) ergibt: 0x0c //00001100

EDIT: Dies wird häufig benutzt, um bestimmte Bits in einem Register zu setzen/löschen:

einRegister |= (1 << EIN_BIT) | (1 << ANDERES_BIT);

setzt die Bits, die durch EIN_BIT und ANDERES_BIT gekennzeichnet sind (die entsprechende Bit-Nummer)

Felix G
30.07.2008, 08:19
Außerdem wäre noch zu erwähnen, daß man << und >> hervorragend zur Multiplikation mit, bzw. Division durch Potenzen von 2 nutzen kann...

a << 2 liefert z.B. das gleiche Ergebnis wie a*4
a >> 1 ist dementsprechend gleichbedeutend mit a/2

Das sollte man wissen, da man auf diese Art z.B. schnelle Divisionen realisieren kann, auch wenn der verwendete µC eigentlich nicht dividieren kann (z.B. AVR).

Will man << für Multiplikationen nutzen, sollte man beachten ob der verwendete µC einen Barrel-Shifter hat. Bei den AVR Controllern ist das z.B. nicht der Fall und eine Multiplikation benötigt zudem nur 2 Zyklen, so daß ein Shift nur bei der Multiplikation mit 2 schneller ist.

sternst
30.07.2008, 08:36
Kleiner Zusatz:


und eine Multiplikation benötigt zudem nur 2 Zyklen, so daß ein Shift nur bei der Multiplikation mit 2 schneller ist.
Nicht alle AVRs haben einen Hardware-Multiplizierer.

oberallgeier
30.07.2008, 09:00
Nicht alle AVRs haben einen Hardware-Multiplizierer.
Nach (m)einer Liste mit 84 AVR´s haben die mega´s alle einen und die tiny´s keinen Hardware-Multiplizierer. In dieser Liste sind das 52 Controller von ATmega8 bis ATmega2561. Im Zweifelsfall wird man natürlich bei ATMEL direkt (http://atmel.com/dyn/products/param_table.asp?family_id=607&OrderBy=1250&Direction=ASC) nachlesen.

sternst
30.07.2008, 09:12
Ich bin mir nicht ganz sicher, was du mir damit jetzt sagen willst.
Sind die Tinys in deinen Augen keine AVRs?

oberallgeier
30.07.2008, 10:34
Ich habe ganz Allgemein, vorzugsweise aber an den Ersteller des Threads Deine Aussage etwas ausführlicher dargestellt und als Hilfe für den Threadersteller noch einen hier sinnvollen Link gegeben. Deinen zweiten Satz brauchen wir hoffentlich nicht zu diskutieren.

BlackDevil
30.07.2008, 13:49
Tip: such nach Bit Operatoren in C bzw C++ - kommt aufs gleiche bei raus - gibt da noch mehr wie |, ||, &, &&, ^, <<, >>