El operador >>
realiza un bit shift.
La expresión >> 1
* es casi el mismo que / 2
para que el programador estaba calculando el índice colorList.Count/2
que es la median **. Para entender por qué este es el caso, debe observar la representación binaria de los números involucrados. Por ejemplo, si tiene 25 elementos en la lista:
n : 0 0 0 1 1 0 0 1 = 25
\ \ \ \ \ \ \
n >> 1: 0 0 0 0 1 1 0 0 = 12
En general utilizando un operador de bits, cuando en realidad se quiere realizar una división es una mala práctica. Probablemente se trate de una optimización prematura realizada porque el programador pensó que sería más rápido realizar una operación bit a bit en lugar de una división. Sería mucho más claro escribir una división y no me sorprendería si el rendimiento de los dos enfoques es comparable.
* La expresión x >> 1
da el mismo resultado que x/2
para todos los enteros positivos y todos los enteros pares negativos. Sin embargo, da un resultado diferente para los enteros impares negativos. Por ejemplo -101 >> 1 == -51
mientras que -101/2 == -50
.
** En realidad, la mediana solo se define de esta manera si la lista tiene un número impar de elementos. Para un número par de elementos, este método estrictamente hablando no dará la mediana.
muchas gracias por la explicación .. estoy familiarizado con el método de desplazamiento y su significado, pero no entendí que es el modo utilizado aquí .. tengo otra pregunta, sin embargo ... es esta forma de dividir en 2 tiene menos complejidad de tiempo que la división "/" normal? – Majd
@Majd: eso depende de la plataforma donde ejecute el código. Recuerde que C# se compila en CIL, que a su vez se traduce ("jitted") en código máquina nativo que difiere de una plataforma a otra. Es muy posible que algunos nervios traduzcan automáticamente 'x/2' en una instrucción de desplazamiento a la derecha. – Timwi
En la primera nota al pie, es un poco confuso que comparen 'x >> 1' con' x/= 2', y creo que el signo '=' es un error tipográfico. Por supuesto, 'x >> 1' es comparable a' x/2', y 'x >> = 1' es comparable a' x/= 2'. –