Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Links- oder Rechts- Shift

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
15.02.2011, 21:39 Uhr
~abrissbirne
Gast


Hi Community,

Achtung es folgt eine Anfängerfrage. Wozu benötigt man einen Rechts- oder Links-Shift? Was bewirkt es, was hat es für Vorteile?

Danke für eure Erklärungen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.02.2011, 23:44 Uhr
Hans
Library Walker
(Operator)


Hi,

von der mathematischen Seite betrachtet, entspricht ein Linksshift einer Multiplikation mit 2, bzw. einem Vielfachen davon, ein Rechtsshift einer Division durch 2 oder einem Vielfachen davon. Zum Beispiel:

Code:
Die Bitfolge:            0000 0110
nach links verschoben:   0000 1100 -> Multiplikation mit 2
nach rechts verschoben:  0000 0011 -> Division durch 2


Diese Art der Multiplikation/Division ist meisst schneller als die Operatoren * und /, funktioniert aber nur bei ganzzahligen Typen. Zur Anschauung auch mal dieses Beispiel (ungetestet):


C++:
int i, j;

i=1;
for (j=1, j<=8; j++)
  { printf ("%3d, %0x\n", j, i);
    i=i << 1;    // Bits von i um eine Stelle nach links schieben
  }



Ansonsten braucht man die meisst, wenn man Systemnah programmiert, und viel mit Bitmustern und deren Manipulation zu tun hat.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 15.02.2011 um 23:46 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
16.02.2011, 08:52 Uhr
ao

(Operator)



Zitat von Hans:

Diese Art der Multiplikation/Division ist meisst schneller als die Operatoren * und / ...

Vor etlichen Jahren war das so üblich, ja. Moderne Compiler beherrschen solche Optimierungen von sich aus, man muss sich also nicht mehr den Quellcode versauen und >> schreiben, wenn man eigentlich / meint.

Es mag Ausnahmen geben, aber in der Regel haben arithmetische und Bitoperationen nichts miteinander zu tun. Deshalb gibt es keinen Grund, sie in einem Ausdruck zu vermischen oder gegeneinander auszutauschen. Fast immer führt sowas zu schlechter lesbarem Code.

Und manchmal auch zu üblen Fehlern, weil nämlich besonders Anfänger dazu neigen, "coole Hacks" einzusetzen, die sie irgendwo gesehen haben, aber nicht vollständig überblicken.

Darum möchte ich davor warnen, << und * bzw. >> und / leichtfertig auszutauschen. Genauso + und |.


Zitat:
Ansonsten braucht man die meisst, wenn man Systemnah programmiert, und viel mit Bitmustern und deren Manipulation zu tun hat.


Richtig. In Quellcodes für Mikrocontroller tauchen sie sehr häufig auf, dort, wo Hardware-Register programmiert werden und wo einzelne Bits oder Gruppen von Bits gezielt angesprochen werden.

In diesem Anwendungsbereich ist besonders wichtig, dass man sich angewöhnt, nur mit unsigned-Variablen zu arbeiten (also unsigned long, unsigned short und so). Beim Rechtsschieben von Signed-Werten werden nämlich von links nur dann Null-Bits nachgefüllt, wenn das höchste Bit 0 ist. Ist das höchste Bit 1, dann werden Eins-Bits nachgeschoben, und das kann in Hardware-Registern katastrophale Folgen haben. Unsigned-Variablen sind da ungefährlich, die werden immer mit Nullen aufgefüllt.

Dieser Post wurde am 16.02.2011 um 09:04 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.02.2011, 16:06 Uhr
~abrissbirne
Gast


Danke für eure Erklärungen. Für meinen Zweck tuns dann also * und /. Aber es ist trotzdem nicht schlecht die Funktionsweise << und >> im Hinterkopf zu behalten.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: