2010-08-14 16 views
7

Ich lief in dieser Aussage in einem Stück Code:Was macht der Operator ">>" in C#?

Int32 medianIndex = colorList.Count >> 1; 

colorList eine Liste der Klasse ist System.Drawing.Color.

Jetzt soll die Anweisung den Medianindex der Liste abrufen .. wie der halbe Punkt davon .. aber ich kann nicht verstehen, wie das >> Symbol funktioniert und wie die "1" den Median geben soll Index .. Ich würde etwas Hilfe schätzen: S

Antwort

12

Der >> Bediener führt einen bit shift durch.

Der Ausdruck >> 1 ist fast * das selbe wie / 2, also berechnete der Programmierer den Index colorList.Count/2, der ** der median ist. Um zu verstehen, warum dies der Fall ist, müssen Sie die Binärdarstellung der beteiligten Zahlen betrachten. Zum Beispiel, wenn Sie 25 Elemente in Ihrer Liste:

n  : 0 0 0 1 1 0 0 1 = 25 
     \ \ \ \ \ \ \ 
n >> 1: 0 0 0 0 1 1 0 0 = 12 

Im Allgemeinen eines bitweise Operator, wenn Sie wirklich eine Division ausführen wollen eine schlechte Praxis ist. Es ist wahrscheinlich eine vorzeitige Optimierung, da der Programmierer dachte, es wäre schneller, eine bitweise Operation statt einer Division durchzuführen. Es wäre viel klarer, eine Abteilung zu schreiben, und ich wäre nicht überrascht, wenn die Leistung der beiden Ansätze vergleichbar wäre.

* Der Ausdruck x >> 1 ergibt das gleiche Ergebnis wie x/2 für alle positiven ganzen Zahlen und alle negativen geraden ganzen Zahlen. Es ergibt jedoch ein anderes Ergebnis für negative ungerade ganze Zahlen. Zum Beispiel -101 >> 1 == -51 wohingegen -101/2 == -50.

** Tatsächlich ist der Median nur auf diese Weise definiert, wenn die Liste eine ungerade Anzahl von Elementen enthält. Für eine gerade Anzahl von Elementen wird diese Methode streng genommen nicht den Median ergeben.

+0

Vielen Dank für die Erklärung .. Ich bin vertraut mit der Verschiebung Methode und es bedeutet, aber ich habe nicht, dass es die Art ist hier verwendet .. Ich habe eine andere Frage, obwohl .. ist diese Art der Aufteilung auf 2 hat weniger Zeit Komplexität als die normale "/" Division? – Majd

+0

@Majd: Das hängt von der Plattform ab, auf der Sie den Code ausführen. Denken Sie daran, dass C# in CIL kompiliert wird, das wiederum in nativen Maschinencode übersetzt ("jitted") wird, der sich von Plattform zu Plattform unterscheidet. Es kann gut möglich sein, dass einige Jitter automatisch "x/2" in eine Shift-Right-Anweisung übersetzen. – Timwi

+0

In der ersten Fußnote ist es ein wenig verwirrend, dass man "x >> 1" mit "x/= 2" vergleicht, und ich denke, das '=' Zeichen ist ein Tippfehler. Natürlich ist "x >> 1" mit "x/2" vergleichbar, und "x >> = 1" ist mit "x/= 2" vergleichbar. –

0

Es ist nicht sehr lesbaren Code, im Grunde teilt sie nur die Anzahl von 2.

>> wird die Shift-rechts-Operator, alle Bits um eine Position nach rechts verschoben.

0110 (6) werden 0011 (3)

+0

Bits, keine Bytes. – Timwi

+0

@Timwi: Danke, natürlich hast du Recht, korrigiert es. – dbemerlin

1

>> die Rechtsverschiebung bitweise Operator ist, und um 1 colorList.Count nach rechts verschoben ist mehr oder weniger gleich colorList.Count/2.

Eine Rechtsverschiebung von a >> b kann als a/2^b definiert werden.

Warum Sie eine Rechtsverschiebung anstelle von 2 verwenden, habe ich keine Ahnung.

+0

Verwenden Sie es nicht, anstatt durch 2 zu teilen. Das JIT optimiert diese Art von Zeug. –

2

Es ist eine bitweise opperator eine Definition i packte gerade von http://en.wikibooks.org/wiki/C_Sharp_Programming/Operators:

Der binäre Operator >> wertet seine Operanden und gibt das resultierende erste Argument rechts verschoben durch die Anzahl der Bits, die durch das zweite Argument angegeben. Sie verwirft Bits niedriger Ordnung, die über die Größe ihres ersten Arguments hinaus verschoben sind, und setzt neue höherwertige Bits auf das Vorzeichenbit des ersten Arguments oder auf Null, wenn das erste Argument nicht vorzeichenbehaftet ist.

Sein im Grunde durch 2 ...

+0

+1 für die Verknüpfung mit der Dokumentation. Ich finde, wenn das lustig ist, hat sich das OP sogar die Mühe gemacht, hier zu posten, anstatt einfach zu den Definitionen der Sprache überzugehen. Eine solche Frage zu stellen ist etwas, das mich dazu bringt, mit meinen Mitarbeitern über ihre Einstellung zu sprechen (nicht: Ich verstehe nicht, was Bigshift ist "aber" hey, ich bin zu faul, Sprachspezifikationen für Code, den ich überprüfe, zu lesen). – TomTom

1

C-Programmierer (von denen ich seit über 20 Jahren bin) haben routinemäßig bitweise Verschiebungen für Multiplikation oder Division durch Potenzen von 2 verwendet. Der Grund war, dass in älteren Architekturen (denke 2 MHz Prozessor, 32K Speicher, und keine Platte) war es signifikant schneller zu verschieben und im Allgemeinen zu einem einzigen Maschinenbefehl kompiliert. Auch wenn ich jetzt hauptsächlich C# schreibe, benutze ich immer noch als Gewohnheitssache manchmal diesen Trick. Eine andere gängige C-Konvention, die die meisten C# -Programmierer noch nie gesehen haben, ist eine Zuweisung innerhalb einer Bedingung. Zum Beispiel:

if ((a = getmeanumber()) == 0) 
    /* do something */ ; 

Wie dem auch sei, in Bezug auf die ursprüngliche Frage und die Gründe für ihre Verwendung, sie weitgehend nicht mehr existieren, außer mit dem begrenzten Bereich der Embedded-Programmierung, wo jedes Byte und Taktzyklus Materie könnte.