Что делает оператор " > > "в 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)