Что делает оператор " > > "в C#?

я столкнулся с этим утверждением в куске кода:

Int32 medianIndex = colorList.Count >> 1;

colorList - Это список классов System.Drawing.Color.

теперь оператор должен получить медианный индекс списка .. как и половина дела .. но я не могу понять, как это ... --3--> Символ работает и как "1" должен дать средний показатель .. Я был бы признателен за помощь: S

5 ответов


на >> оператор выполняет бит shift.

выражение >> 1 почти* то же самое, что / 2 Итак, программист вычислял индекс colorList.Count / 2 что** в в среднем. Чтобы понять, почему это дело нужно посмотреть на двоичное представление числа. Например, если в вашем списке 25 элементов:

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

в общем, используя побитовый оператор, когда вы действительно хотите выполнить разделение-плохая практика. Вероятно, это преждевременная оптимизация, потому что программист думал, что будет быстрее выполнять побитовую операцию вместо деления. Было бы намного яснее написать разделение, и я не удивлюсь, если производительность двух подходов будет сопоставима.

*выражение x >> 1 дает тот же результат, что и x / 2 для всех положительных и всех отрицательных четных чисел. Однако это дает другой результат для отрицательных нечетных целое число. Например -101 >> 1 == -51, тогда как -101 / 2 == -50.

**фактически медиана определяется таким образом, только если список имеет нечетное количество элементов. Для четного числа элементов этот метод, строго говоря, не дают медиана.


Это побитовое opperator определение, я просто схватила со http://en.wikibooks.org/wiki/C_Sharp_Programming/Operators:

двоичный оператор > > вычисляет свои операнды и возвращает результирующий первый аргумент, сдвинутый вправо на количество битов, указанное вторым аргументом. Он отбрасывает биты низкого порядка, смещенные за пределы размера его первого аргумента, и устанавливает новые биты высокого порядка в знаковый бит первого аргумента или в ноль, если первый аргумент не имеет знака.

его в основном деление на 2...


>> является побитовым оператором сдвига вправо и сдвигом colorList.Count справа на 1 более или менее эквивалентно colorList.Count / 2.

правая смена a >> b можно определить как a / 2 ^ b.

Что касается того, почему вы используете сдвиг вправо, а не деление на 2, я понятия не имею.


C (одним из которых я был более 20 лет) обычно использовали побитовые сдвиги для умножения или деления на степени 2. Причина заключалась в том, что в более старых архитектурах (например, процессор 2 МГц, 32K памяти и без диска) было значительно быстрее переключаться и обычно компилироваться в одну машинную инструкцию. Хотя сейчас я пишу в основном C#, я все еще, по привычке, иногда использую этот трюк. Еще одно общее соглашение C, которое большинство программистов C# никогда не видели имеет назначение, встроенное в условие. Например:

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

в любом случае, что касается исходного вопроса и причин его использования, они в основном больше не существуют, за исключением ограниченной области встроенного программирования, где каждый байт и тактовый цикл могут иметь значение.


это не очень читаемый код, в основном он просто делит число на 2.

>>-оператор сдвига вправо, смещающий все биты на одну позицию вправо.

0110 (6) становится 0011 (3)