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.
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
@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
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. –