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

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

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

Я довольно новичок в C # и пытаюсь сделать базовое программное обеспечение для обработки изображений. Я понимаю, что этот фрагмент извлекает A, R, G, B из значения ARGB int пикселя WriteableBitmap "current"

for(int i = 0; i < bitmapArray.Length; i++) {
    var current = bitmapArray[i];

    var alpha = (byte)(current >> 24);
    var red = (byte)(current >> 16);
    var green = (byte)(current >> 8);
    var blue = (byte)(current);
    //Some code
 }

Что делает «>>» для преобразования значений?

Кроме того, если я выполню некоторые вычисления для r, g и b по отдельности, как мне преобразовать их обратно в целочисленное значение ARGB, чтобы заменить исходный пиксель новым?

Заранее спасибо.

Редактировать: спасибо, ребята, теперь это имеет смысл.

Ответы [ 3 ]

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

Это бинарный оператор сдвига.

Если у вас есть цвет, определенный (a, r, g, b), его двоичное представление будет выглядеть так (при условии, что глубина канала составляет 8 бит):

AAAAAAAA RRRRRRRR GGGGGGGG BBBBBBBB

Итак, сдвиньте все это на 24 места, и у вас останется альфа-канал

AAAAAAAA

Сдвиг на 16, и вы получите альфа-канал и красный канал

AAAAAAAARRRRRRRR

Теперь, поскольку он приводится в виде байта, извлекаются только первые 8 бит

(byte)AAAAAAAARRRRRRRR == RRRRRRRR

Вы также можете получить красный канал, сдвинув 16 мест и AND'ing с 11111111 (0xFF)

AAAAAAAARRRRRRRR &
0000000011111111
----------------
00000000RRRRRRRR
12 голосов
/ 15 августа 2010

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

http://msdn.microsoft.com/en-us/library/xt18et0d.aspx

Предполагая, что ваш массив содержитints, чтобы получить вычисленное значение обратно в элемент массива, вы бы обратили процесс сдвига битов и ИЛИ результаты обратно вместе, вот так:

int current = (alpha << 24) | (red << 16) | (green << 8) | blue; 
2 голосов
/ 15 августа 2010

В дополнение к ответу Роберта - и для охвата второй части вашего вопроса - вы можете объединить отдельные компоненты обратно в целое число, используя << (сдвиг влево) и | (побитовое ИЛИ) операторы:

int combined = (alpha << 24) | (red << 16) | (green << 8) | blue;
...