Что делает оператор >> в C #? - PullRequest
       35

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

7 голосов
/ 15 августа 2010

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

Int32 medianIndex = colorList.Count >> 1;

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

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

Ответы [ 5 ]

12 голосов
/ 15 августа 2010

Оператор >> выполняет сдвиг бит .

Выражение >> 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.

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

2 голосов
/ 15 августа 2010

Это битовый оператор, определение, которое я только что получил от http://en.wikibooks.org/wiki/C_Sharp_Programming/Operators:

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

В основном этоделение на 2 ...

1 голос
/ 15 августа 2010
Программисты

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

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

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

1 голос
/ 15 августа 2010

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

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

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

0 голосов
/ 15 августа 2010

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

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

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

...